@fluid-experimental/data-objects 2.1.0 → 2.3.0-288113
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/README.md +2 -2
- package/api-report/data-objects.alpha.api.md +16 -1
- package/api-report/data-objects.beta.api.md +0 -2
- package/api-report/data-objects.public.api.md +0 -2
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/signaler/signaler.d.ts +7 -4
- package/dist/signaler/signaler.d.ts.map +1 -1
- package/dist/signaler/signaler.js +2 -2
- package/dist/signaler/signaler.js.map +1 -1
- package/lib/index.d.ts +9 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +9 -0
- package/lib/index.js.map +1 -1
- package/lib/signaler/signaler.d.ts +7 -4
- package/lib/signaler/signaler.d.ts.map +1 -1
- package/lib/signaler/signaler.js +2 -2
- package/lib/signaler/signaler.js.map +1 -1
- package/package.json +11 -11
- package/src/index.ts +10 -0
- package/src/signaler/README.md +2 -2
- package/src/signaler/signaler.ts +7 -4
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
A collection of ready to use Fluid Data Objects.
|
|
4
4
|
|
|
5
|
-
<!-- AUTO-GENERATED-CONTENT:START (
|
|
5
|
+
<!-- AUTO-GENERATED-CONTENT:START (LIBRARY_README_HEADER) -->
|
|
6
6
|
|
|
7
7
|
<!-- prettier-ignore-start -->
|
|
8
8
|
<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->
|
|
@@ -36,7 +36,7 @@ API documentation for **@fluid-experimental/data-objects** is available at <http
|
|
|
36
36
|
|
|
37
37
|
<!-- AUTO-GENERATED-CONTENT:END -->
|
|
38
38
|
|
|
39
|
-
<!-- AUTO-GENERATED-CONTENT:START (
|
|
39
|
+
<!-- AUTO-GENERATED-CONTENT:START (README_FOOTER) -->
|
|
40
40
|
|
|
41
41
|
<!-- prettier-ignore-start -->
|
|
42
42
|
<!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->
|
|
@@ -4,6 +4,21 @@
|
|
|
4
4
|
|
|
5
5
|
```ts
|
|
6
6
|
|
|
7
|
-
//
|
|
7
|
+
// @alpha
|
|
8
|
+
export interface ISignaler extends IEventProvider<IErrorEvent> {
|
|
9
|
+
offSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;
|
|
10
|
+
onSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;
|
|
11
|
+
submitSignal<T>(signalName: string, payload?: Jsonable<T>): any;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// @alpha
|
|
15
|
+
export const Signaler: {
|
|
16
|
+
readonly factory: IFluidDataStoreFactory & {
|
|
17
|
+
readonly registryEntry: NamedFluidDataStoreRegistryEntry;
|
|
18
|
+
};
|
|
19
|
+
} & SharedObjectKind<ISignaler>;
|
|
20
|
+
|
|
21
|
+
// @alpha
|
|
22
|
+
export type SignalListener<T> = (clientId: string, local: boolean, payload: Jsonable<T>) => void;
|
|
8
23
|
|
|
9
24
|
```
|
package/dist/index.d.ts
CHANGED
|
@@ -2,5 +2,14 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Experimental data object providing access to signals infrastructure.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*
|
|
10
|
+
* @privateRemarks
|
|
11
|
+
* This package is tagged despite being experimental to make API surface
|
|
12
|
+
* more visible. Import specs do not need qualified with `/alpha`, etc.
|
|
13
|
+
*/
|
|
5
14
|
export { IRuntimeSignaler, ISignaler, Signaler, SignalListener } from "./signaler/index.js";
|
|
6
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,15 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.Signaler = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* Experimental data object providing access to signals infrastructure.
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*
|
|
13
|
+
* @privateRemarks
|
|
14
|
+
* This package is tagged despite being experimental to make API surface
|
|
15
|
+
* more visible. Import specs do not need qualified with `/alpha`, etc.
|
|
16
|
+
*/
|
|
8
17
|
var index_js_1 = require("./signaler/index.js");
|
|
9
18
|
Object.defineProperty(exports, "Signaler", { enumerable: true, get: function () { return index_js_1.Signaler; } });
|
|
10
19
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,gDAA4F;AAAtD,oGAAA,QAAQ,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { IRuntimeSignaler, ISignaler, Signaler, SignalListener } from \"./signaler/index.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH;;;;;;;;GAQG;AAEH,gDAA4F;AAAtD,oGAAA,QAAQ,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * Experimental data object providing access to signals infrastructure.\n *\n * @packageDocumentation\n *\n * @privateRemarks\n * This package is tagged despite being experimental to make API surface\n * more visible. Import specs do not need qualified with `/alpha`, etc.\n */\n\nexport { IRuntimeSignaler, ISignaler, Signaler, SignalListener } from \"./signaler/index.js\";\n"]}
|
|
@@ -8,14 +8,15 @@ import type { IFluidDataStoreFactory, NamedFluidDataStoreRegistryEntry } from "@
|
|
|
8
8
|
import { IInboundSignalMessage } from "@fluidframework/runtime-definitions/internal";
|
|
9
9
|
import type { SharedObjectKind } from "@fluidframework/shared-object-base";
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Signature for listening to a signal event
|
|
12
|
+
* @alpha
|
|
12
13
|
*/
|
|
13
14
|
export type SignalListener<T> = (clientId: string, local: boolean, payload: Jsonable<T>) => void;
|
|
14
15
|
/**
|
|
15
16
|
* ISignaler defines an interface for working with signals that is similar to the more common
|
|
16
17
|
* eventing patterns of EventEmitter. In addition to sending and responding to signals, it
|
|
17
18
|
* provides explicit methods around signal requests to other connected clients.
|
|
18
|
-
* @
|
|
19
|
+
* @alpha
|
|
19
20
|
*/
|
|
20
21
|
export interface ISignaler extends IEventProvider<IErrorEvent> {
|
|
21
22
|
/**
|
|
@@ -45,6 +46,8 @@ export interface ISignaler extends IEventProvider<IErrorEvent> {
|
|
|
45
46
|
* Duck type of something that provides the expected signalling functionality:
|
|
46
47
|
* A way to verify we can signal, a way to send a signal, and a way to listen for incoming signals
|
|
47
48
|
* @internal
|
|
49
|
+
* @privateRemarks
|
|
50
|
+
* There is no use external to package and export can be removed once breaking changes are permitted.
|
|
48
51
|
*/
|
|
49
52
|
export interface IRuntimeSignaler {
|
|
50
53
|
connected: boolean;
|
|
@@ -55,8 +58,8 @@ export interface IRuntimeSignaler {
|
|
|
55
58
|
* Implementation of ISignaler for declarative API.
|
|
56
59
|
* @privateRemarks
|
|
57
60
|
* `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`,
|
|
59
|
-
* @
|
|
61
|
+
* If this eventually gets promoted to `@public` and/or part of `fluid-framework`, an alternate LegacySignaler (`@legacy`) should be created to continue exposing `factory`.
|
|
62
|
+
* @alpha
|
|
60
63
|
*/
|
|
61
64
|
export declare const Signaler: {
|
|
62
65
|
readonly factory: IFluidDataStoreFactory & {
|
|
@@ -1 +1 @@
|
|
|
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
|
|
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;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,KAChB,IAAI,CAAC;AAEV;;;;;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;;;;;;GAMG;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;AAqHD;;;;;;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"}
|
|
@@ -101,8 +101,8 @@ SignalerClass.factory = new internal_1.DataObjectFactory(SignalerClass.Name, Sig
|
|
|
101
101
|
* Implementation of ISignaler for declarative API.
|
|
102
102
|
* @privateRemarks
|
|
103
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`,
|
|
105
|
-
* @
|
|
104
|
+
* If this eventually gets promoted to `@public` and/or part of `fluid-framework`, an alternate LegacySignaler (`@legacy`) should be created to continue exposing `factory`.
|
|
105
|
+
* @alpha
|
|
106
106
|
*/
|
|
107
107
|
exports.Signaler = (0, internal_1.createDataObjectKind)(SignalerClass);
|
|
108
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 {\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> = (\n\tclientId: string,\n\tlocal: boolean,\n\tpayload: Jsonable<T>,\n) => 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\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(\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"]}
|
|
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 * Signature for listening to a signal event\n * @alpha\n */\nexport type SignalListener<T> = (\n\tclientId: string,\n\tlocal: boolean,\n\tpayload: Jsonable<T>,\n) => 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 * @alpha\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 * @privateRemarks\n * There is no use external to package and export can be removed once breaking changes are permitted.\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\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(\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`, an alternate LegacySignaler (`@legacy`) should be created to continue exposing `factory`.\n * @alpha\n */\nexport const Signaler: {\n\treadonly factory: IFluidDataStoreFactory & {\n\t\treadonly registryEntry: NamedFluidDataStoreRegistryEntry;\n\t};\n} & SharedObjectKind<ISignaler> = createDataObjectKind(SignalerClass);\n"]}
|
package/lib/index.d.ts
CHANGED
|
@@ -2,5 +2,14 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Experimental data object providing access to signals infrastructure.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*
|
|
10
|
+
* @privateRemarks
|
|
11
|
+
* This package is tagged despite being experimental to make API surface
|
|
12
|
+
* more visible. Import specs do not need qualified with `/alpha`, etc.
|
|
13
|
+
*/
|
|
5
14
|
export { IRuntimeSignaler, ISignaler, Signaler, SignalListener } from "./signaler/index.js";
|
|
6
15
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -2,5 +2,14 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Experimental data object providing access to signals infrastructure.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*
|
|
10
|
+
* @privateRemarks
|
|
11
|
+
* This package is tagged despite being experimental to make API surface
|
|
12
|
+
* more visible. Import specs do not need qualified with `/alpha`, etc.
|
|
13
|
+
*/
|
|
5
14
|
export { Signaler } from "./signaler/index.js";
|
|
6
15
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA+B,QAAQ,EAAkB,MAAM,qBAAqB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { IRuntimeSignaler, ISignaler, Signaler, SignalListener } from \"./signaler/index.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AAEH,OAAO,EAA+B,QAAQ,EAAkB,MAAM,qBAAqB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * Experimental data object providing access to signals infrastructure.\n *\n * @packageDocumentation\n *\n * @privateRemarks\n * This package is tagged despite being experimental to make API surface\n * more visible. Import specs do not need qualified with `/alpha`, etc.\n */\n\nexport { IRuntimeSignaler, ISignaler, Signaler, SignalListener } from \"./signaler/index.js\";\n"]}
|
|
@@ -8,14 +8,15 @@ import type { IFluidDataStoreFactory, NamedFluidDataStoreRegistryEntry } from "@
|
|
|
8
8
|
import { IInboundSignalMessage } from "@fluidframework/runtime-definitions/internal";
|
|
9
9
|
import type { SharedObjectKind } from "@fluidframework/shared-object-base";
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Signature for listening to a signal event
|
|
12
|
+
* @alpha
|
|
12
13
|
*/
|
|
13
14
|
export type SignalListener<T> = (clientId: string, local: boolean, payload: Jsonable<T>) => void;
|
|
14
15
|
/**
|
|
15
16
|
* ISignaler defines an interface for working with signals that is similar to the more common
|
|
16
17
|
* eventing patterns of EventEmitter. In addition to sending and responding to signals, it
|
|
17
18
|
* provides explicit methods around signal requests to other connected clients.
|
|
18
|
-
* @
|
|
19
|
+
* @alpha
|
|
19
20
|
*/
|
|
20
21
|
export interface ISignaler extends IEventProvider<IErrorEvent> {
|
|
21
22
|
/**
|
|
@@ -45,6 +46,8 @@ export interface ISignaler extends IEventProvider<IErrorEvent> {
|
|
|
45
46
|
* Duck type of something that provides the expected signalling functionality:
|
|
46
47
|
* A way to verify we can signal, a way to send a signal, and a way to listen for incoming signals
|
|
47
48
|
* @internal
|
|
49
|
+
* @privateRemarks
|
|
50
|
+
* There is no use external to package and export can be removed once breaking changes are permitted.
|
|
48
51
|
*/
|
|
49
52
|
export interface IRuntimeSignaler {
|
|
50
53
|
connected: boolean;
|
|
@@ -55,8 +58,8 @@ export interface IRuntimeSignaler {
|
|
|
55
58
|
* Implementation of ISignaler for declarative API.
|
|
56
59
|
* @privateRemarks
|
|
57
60
|
* `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`,
|
|
59
|
-
* @
|
|
61
|
+
* If this eventually gets promoted to `@public` and/or part of `fluid-framework`, an alternate LegacySignaler (`@legacy`) should be created to continue exposing `factory`.
|
|
62
|
+
* @alpha
|
|
60
63
|
*/
|
|
61
64
|
export declare const Signaler: {
|
|
62
65
|
readonly factory: IFluidDataStoreFactory & {
|
|
@@ -1 +1 @@
|
|
|
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
|
|
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;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,KAChB,IAAI,CAAC;AAEV;;;;;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;;;;;;GAMG;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;AAqHD;;;;;;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"}
|
package/lib/signaler/signaler.js
CHANGED
|
@@ -98,8 +98,8 @@ SignalerClass.factory = new DataObjectFactory(SignalerClass.Name, SignalerClass,
|
|
|
98
98
|
* Implementation of ISignaler for declarative API.
|
|
99
99
|
* @privateRemarks
|
|
100
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`,
|
|
102
|
-
* @
|
|
101
|
+
* If this eventually gets promoted to `@public` and/or part of `fluid-framework`, an alternate LegacySignaler (`@legacy`) should be created to continue exposing `factory`.
|
|
102
|
+
* @alpha
|
|
103
103
|
*/
|
|
104
104
|
export const Signaler = createDataObjectKind(SignalerClass);
|
|
105
105
|
//# 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 {\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> = (\n\tclientId: string,\n\tlocal: boolean,\n\tpayload: Jsonable<T>,\n) => 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\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(\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"]}
|
|
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 * Signature for listening to a signal event\n * @alpha\n */\nexport type SignalListener<T> = (\n\tclientId: string,\n\tlocal: boolean,\n\tpayload: Jsonable<T>,\n) => 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 * @alpha\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 * @privateRemarks\n * There is no use external to package and export can be removed once breaking changes are permitted.\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\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(\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`, an alternate LegacySignaler (`@legacy`) should be created to continue exposing `factory`.\n * @alpha\n */\nexport const Signaler: {\n\treadonly factory: IFluidDataStoreFactory & {\n\t\treadonly registryEntry: NamedFluidDataStoreRegistryEntry;\n\t};\n} & SharedObjectKind<ISignaler> = createDataObjectKind(SignalerClass);\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluid-experimental/data-objects",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0-288113",
|
|
4
4
|
"description": "A collection of ready to use Fluid Data Objects",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -27,21 +27,21 @@
|
|
|
27
27
|
"main": "lib/index.js",
|
|
28
28
|
"types": "lib/index.d.ts",
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@fluid-internal/client-utils": "
|
|
31
|
-
"@fluidframework/aqueduct": "
|
|
32
|
-
"@fluidframework/core-interfaces": "
|
|
33
|
-
"@fluidframework/core-utils": "
|
|
34
|
-
"@fluidframework/datastore-definitions": "
|
|
35
|
-
"@fluidframework/map": "
|
|
36
|
-
"@fluidframework/runtime-definitions": "
|
|
37
|
-
"@fluidframework/shared-object-base": "
|
|
30
|
+
"@fluid-internal/client-utils": "2.3.0-288113",
|
|
31
|
+
"@fluidframework/aqueduct": "2.3.0-288113",
|
|
32
|
+
"@fluidframework/core-interfaces": "2.3.0-288113",
|
|
33
|
+
"@fluidframework/core-utils": "2.3.0-288113",
|
|
34
|
+
"@fluidframework/datastore-definitions": "2.3.0-288113",
|
|
35
|
+
"@fluidframework/map": "2.3.0-288113",
|
|
36
|
+
"@fluidframework/runtime-definitions": "2.3.0-288113",
|
|
37
|
+
"@fluidframework/shared-object-base": "2.3.0-288113"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@arethetypeswrong/cli": "^0.15.2",
|
|
41
41
|
"@biomejs/biome": "~1.8.3",
|
|
42
|
-
"@fluid-tools/build-cli": "^0.
|
|
42
|
+
"@fluid-tools/build-cli": "^0.43.0",
|
|
43
43
|
"@fluidframework/build-common": "^2.0.3",
|
|
44
|
-
"@fluidframework/build-tools": "^0.
|
|
44
|
+
"@fluidframework/build-tools": "^0.43.0",
|
|
45
45
|
"@fluidframework/eslint-config-fluid": "^5.3.0",
|
|
46
46
|
"@microsoft/api-extractor": "^7.45.1",
|
|
47
47
|
"@types/node": "^18.19.0",
|
package/src/index.ts
CHANGED
|
@@ -3,4 +3,14 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Experimental data object providing access to signals infrastructure.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*
|
|
11
|
+
* @privateRemarks
|
|
12
|
+
* This package is tagged despite being experimental to make API surface
|
|
13
|
+
* more visible. Import specs do not need qualified with `/alpha`, etc.
|
|
14
|
+
*/
|
|
15
|
+
|
|
6
16
|
export { IRuntimeSignaler, ISignaler, Signaler, SignalListener } from "./signaler/index.js";
|
package/src/signaler/README.md
CHANGED
|
@@ -21,7 +21,7 @@ const containerSchema: ContainerSchema = {
|
|
|
21
21
|
|
|
22
22
|
const { container, services } = await client.createContainer(containerSchema);
|
|
23
23
|
|
|
24
|
-
const signaler = container.initialObjects.signaler
|
|
24
|
+
const signaler = container.initialObjects.signaler; // type is ISignaler
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
`signaler` can then be directly used in your Fluid application!
|
|
@@ -30,7 +30,7 @@ For more information on using `ContainerSchema` to create objects please see [Da
|
|
|
30
30
|
|
|
31
31
|
## API
|
|
32
32
|
|
|
33
|
-
`
|
|
33
|
+
`ISignaler` provides a few simple methods to send signals and add/remove listeners to specific signals as well:
|
|
34
34
|
|
|
35
35
|
- `submitSignal(signalName: string, payload?: Jsonable)` - Sends a signal with a payload to its connected listeners
|
|
36
36
|
- `onSignal(signalName: string, listener: SignalListener)` - Adds a listener for the specified signal. Same behavior as EventEmitter's `on` method.
|
package/src/signaler/signaler.ts
CHANGED
|
@@ -24,7 +24,8 @@ import type { SharedObjectKind } from "@fluidframework/shared-object-base";
|
|
|
24
24
|
// throttling and batching
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
27
|
+
* Signature for listening to a signal event
|
|
28
|
+
* @alpha
|
|
28
29
|
*/
|
|
29
30
|
export type SignalListener<T> = (
|
|
30
31
|
clientId: string,
|
|
@@ -36,7 +37,7 @@ export type SignalListener<T> = (
|
|
|
36
37
|
* ISignaler defines an interface for working with signals that is similar to the more common
|
|
37
38
|
* eventing patterns of EventEmitter. In addition to sending and responding to signals, it
|
|
38
39
|
* provides explicit methods around signal requests to other connected clients.
|
|
39
|
-
* @
|
|
40
|
+
* @alpha
|
|
40
41
|
*/
|
|
41
42
|
export interface ISignaler extends IEventProvider<IErrorEvent> {
|
|
42
43
|
/**
|
|
@@ -67,6 +68,8 @@ export interface ISignaler extends IEventProvider<IErrorEvent> {
|
|
|
67
68
|
* Duck type of something that provides the expected signalling functionality:
|
|
68
69
|
* A way to verify we can signal, a way to send a signal, and a way to listen for incoming signals
|
|
69
70
|
* @internal
|
|
71
|
+
* @privateRemarks
|
|
72
|
+
* There is no use external to package and export can be removed once breaking changes are permitted.
|
|
70
73
|
*/
|
|
71
74
|
export interface IRuntimeSignaler {
|
|
72
75
|
connected: boolean;
|
|
@@ -193,8 +196,8 @@ class SignalerClass
|
|
|
193
196
|
* Implementation of ISignaler for declarative API.
|
|
194
197
|
* @privateRemarks
|
|
195
198
|
* `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.
|
|
196
|
-
* If this eventually gets promoted to `@public` and/or part of `fluid-framework`,
|
|
197
|
-
* @
|
|
199
|
+
* If this eventually gets promoted to `@public` and/or part of `fluid-framework`, an alternate LegacySignaler (`@legacy`) should be created to continue exposing `factory`.
|
|
200
|
+
* @alpha
|
|
198
201
|
*/
|
|
199
202
|
export const Signaler: {
|
|
200
203
|
readonly factory: IFluidDataStoreFactory & {
|