@fluid-experimental/data-objects 0.52.1 → 0.53.0-46105
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/dist/kvpair/DataObject.d.ts +2 -3
- package/dist/kvpair/DataObject.d.ts.map +1 -1
- package/dist/kvpair/DataObject.js.map +1 -1
- package/dist/signalManager/signalManager.d.ts +6 -2
- package/dist/signalManager/signalManager.d.ts.map +1 -1
- package/dist/signalManager/signalManager.js +0 -1
- package/dist/signalManager/signalManager.js.map +1 -1
- package/lib/kvpair/DataObject.d.ts +2 -3
- package/lib/kvpair/DataObject.d.ts.map +1 -1
- package/lib/kvpair/DataObject.js.map +1 -1
- package/lib/signalManager/signalManager.d.ts +6 -2
- package/lib/signalManager/signalManager.d.ts.map +1 -1
- package/lib/signalManager/signalManager.js +0 -1
- package/lib/signalManager/signalManager.js.map +1 -1
- package/package.json +5 -5
- package/src/kvpair/DataObject.ts +1 -2
- package/src/signalManager/signalManager.ts +2 -3
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
/// <reference types="node" />
|
|
6
6
|
import { EventEmitter } from "events";
|
|
7
7
|
import { DataObject, DataObjectFactory } from "@fluidframework/aqueduct";
|
|
8
|
-
import { IEvent } from "@fluidframework/common-definitions";
|
|
9
8
|
import { IDirectoryValueChanged } from "@fluidframework/map";
|
|
10
9
|
/**
|
|
11
10
|
* IKeyValueDataObject describes the public API surface for our KeyValue DataObject.
|
|
@@ -39,7 +38,7 @@ export interface IKeyValueDataObject extends EventEmitter {
|
|
|
39
38
|
* The KeyValueDataObject is our data object that implements the IKeyValueDataObject interface.
|
|
40
39
|
*/
|
|
41
40
|
export declare class KeyValueDataObject extends DataObject implements IKeyValueDataObject {
|
|
42
|
-
static readonly factory: DataObjectFactory<KeyValueDataObject,
|
|
41
|
+
static readonly factory: DataObjectFactory<KeyValueDataObject, import("@fluidframework/aqueduct").DataObjectTypes>;
|
|
43
42
|
/**
|
|
44
43
|
* hasInitialized is run by each client as they load the DataObject. Here we use it to set up usage of the
|
|
45
44
|
* DataObject, by registering an event listener for changes in data.
|
|
@@ -54,5 +53,5 @@ export declare class KeyValueDataObject extends DataObject implements IKeyValueD
|
|
|
54
53
|
* The DataObjectFactory is used by Fluid Framework to instantiate our DataObject. We provide it with a unique name
|
|
55
54
|
* and the constructor it will call. In this scenario, the third and fourth arguments are not used.
|
|
56
55
|
*/
|
|
57
|
-
export declare const KeyValueInstantiationFactory: DataObjectFactory<KeyValueDataObject,
|
|
56
|
+
export declare const KeyValueInstantiationFactory: DataObjectFactory<KeyValueDataObject, import("@fluidframework/aqueduct").DataObjectTypes>;
|
|
58
57
|
//# sourceMappingURL=DataObject.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataObject.d.ts","sourceRoot":"","sources":["../../src/kvpair/DataObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"DataObject.d.ts","sourceRoot":"","sources":["../../src/kvpair/DataObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAiB,MAAM,qBAAqB,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACrD;;OAEG;IACH,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,GAAG,CAAC;IAE1B;;OAEG;IACH,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAEvC;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,IAAI,GAAG,IAAI,CAAC;IAE7E;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE,CAAC;IAEjB;;;OAGG;IACH,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,GAAG,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAA;CACxF;AAED;;GAEG;AACH,qBAAa,kBACT,SAAQ,UACR,YAAW,mBAAmB;IAC9B,gBAAuB,OAAO,4FAK5B;IAEF;;;OAGG;cACa,cAAc;IAMvB,GAAG,QAAS,MAAM,SAAS,GAAG,UAEnC;IAEK,GAAG,QAAS,MAAM,SAGvB;IAEK,IAAI,QAAO,MAAM,EAAE,CAExB;IAEK,KAAK,4BAA6B,MAAM,KAAK,OAAO,sBAezD;CACL;AAED;;;GAGG;AACH,eAAO,MAAM,4BAA4B,2FAA6B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataObject.js","sourceRoot":"","sources":["../../src/kvpair/DataObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"DataObject.js","sourceRoot":"","sources":["../../src/kvpair/DataObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAkCzE;;GAEG;AACH,MAAM,OAAO,kBACT,SAAQ,UAAU;IADtB;;QAoBW,QAAG,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC;QAEK,QAAG,GAAG,CAAC,GAAW,EAAE,EAAE;YACzB,+DAA+D;YAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC,CAAC;QAEK,SAAI,GAAG,GAAa,EAAE;YACzB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC;QAEK,UAAK,GAAG,CAAC,IAA4C,EAAgC,EAAE;YAC1F,IAAI,IAAI,GAAa,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE;gBACP,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;aACtB;iBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBACjC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;aACjB;iBAAM;gBACH,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;aACnC;YAED,MAAM,QAAQ,GAA2B,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO,CAAC,CAAC,OAAe,EAAE,EAAE;gBAC7B,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QACpB,CAAC,CAAC;IACN,CAAC;IAvCG;;;OAGG;IACO,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,OAAsB,EAAE,EAAE;YACpD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACP,CAAC;;AAfsB,0BAAO,GAAG,IAAI,iBAAiB,CAClD,qBAAqB,EACrB,kBAAkB,EAClB,EAAE,EACF,EAAE,CACL,CAAC;AA2CN;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,kBAAkB,CAAC,OAAO,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { EventEmitter } from \"events\";\nimport { DataObject, DataObjectFactory } from \"@fluidframework/aqueduct\";\nimport { IDirectoryValueChanged, IValueChanged } from \"@fluidframework/map\";\n\n/**\n * IKeyValueDataObject describes the public API surface for our KeyValue DataObject.\n */\nexport interface IKeyValueDataObject extends EventEmitter {\n /**\n * Get value at Key\n */\n get: (key: string) => any;\n\n /**\n * Set Value at Key\n */\n set: (key: string, value: any) => void;\n\n /**\n * Event on value change\n */\n on(event: \"changed\", listener: (args: IDirectoryValueChanged) => void): this;\n\n /**\n * Returns all the keys\n */\n keys(): string[];\n\n /**\n * By default, returns an object containing all key value pairs\n * Filter test function can be passed to limit keys added to object\n */\n query: (test?: string | ((value: string) => boolean)) => any | { [key: string]: any }\n}\n\n/**\n * The KeyValueDataObject is our data object that implements the IKeyValueDataObject interface.\n */\nexport class KeyValueDataObject\n extends DataObject\n implements IKeyValueDataObject {\n public static readonly factory = new DataObjectFactory(\n \"keyvalue-dataobject\",\n KeyValueDataObject,\n [],\n {},\n );\n\n /**\n * hasInitialized is run by each client as they load the DataObject. Here we use it to set up usage of the\n * DataObject, by registering an event listener for changes in data.\n */\n protected async hasInitialized() {\n this.root.on(\"valueChanged\", (changed: IValueChanged) => {\n this.emit(\"changed\", changed);\n });\n }\n\n public set = (key: string, value: any) => {\n this.root.set(key, value);\n };\n\n public get = (key: string) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.root.get(key);\n };\n\n public keys = (): string[] => {\n return Array.from(this.root.keys());\n };\n\n public query = (test?: string | ((value: string) => boolean)): any | { [key: string]: any } => {\n let keys: string[] = [];\n if (!test) {\n keys = this.keys();\n } else if (typeof test === \"string\") {\n keys = [test];\n } else {\n keys = this.keys().filter(test);\n }\n\n const newQuery: { [key: string]: any } = {};\n keys.forEach((element: string) => {\n newQuery[element] = this.get(element);\n });\n return newQuery;\n };\n}\n\n/**\n * The DataObjectFactory is used by Fluid Framework to instantiate our DataObject. We provide it with a unique name\n * and the constructor it will call. In this scenario, the third and fourth arguments are not used.\n */\nexport const KeyValueInstantiationFactory = KeyValueDataObject.factory;\n"]}
|
|
@@ -115,11 +115,15 @@ export declare class Signaler extends TypedEventEmitter<IErrorEvent> implements
|
|
|
115
115
|
* users to get an ISignaler without a custom DO. Where possible, consumers should instead
|
|
116
116
|
* create a Signaler themselves instead of using the DO wrapper to avoid the DO overhead.
|
|
117
117
|
*/
|
|
118
|
-
export declare class SignalManager extends DataObject<{
|
|
118
|
+
export declare class SignalManager extends DataObject<{
|
|
119
|
+
Events: IErrorEvent;
|
|
120
|
+
}> implements EventEmitter, ISignaler {
|
|
119
121
|
private _manager;
|
|
120
122
|
private get manager();
|
|
121
123
|
static get Name(): string;
|
|
122
|
-
static readonly factory: DataObjectFactory<SignalManager,
|
|
124
|
+
static readonly factory: DataObjectFactory<SignalManager, {
|
|
125
|
+
Events: IErrorEvent;
|
|
126
|
+
}>;
|
|
123
127
|
protected hasInitialized(): Promise<void>;
|
|
124
128
|
onSignal(signalName: string, listener: SignalListener): ISignaler;
|
|
125
129
|
offSignal(signalName: string, listener: SignalListener): ISignaler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signalManager.d.ts","sourceRoot":"","sources":["../../src/signalManager/signalManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAU,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAM5E,oBAAY,cAAc,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;AAE3F;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC;IACjE;;;;;;MAME;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9F;;;;OAIG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,OAAE;IAErD;;;;;;;OAOG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC;IAC9E;;;;;;OAMG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC;IAC/E;;;;;OAKG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,OAAE;CAC5D;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,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,GAAG,GAAG,IAAI,CAAC;CAClD;AAED;;;;;;;;GAQG;AACH,qBAAa,QAAS,SAAQ,iBAAiB,CAAC,WAAW,CAAE,YAAW,SAAS;IAMzE;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAE/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;;IAG3C;;OAEG;IACc,QAAQ,EAAE,gBAAgB;IAC3C;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM;IAmBtB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,sBAAsB;IAMvB,QAAQ,CACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,GACzB,SAAS;IAML,SAAS,CACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,GACzB,SAAS;IAML,YAAY,CACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,QAAQ;IAQf,oBAAoB,CACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,GACzB,SAAS;IAKL,qBAAqB,CACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,GACzB,SAAS;IAKL,gBAAgB,CACnB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,QAAQ;CAKzB;AAED;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"signalManager.d.ts","sourceRoot":"","sources":["../../src/signalManager/signalManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -87,7 +87,6 @@ export class Signaler extends TypedEventEmitter {
|
|
|
87
87
|
* users to get an ISignaler without a custom DO. Where possible, consumers should instead
|
|
88
88
|
* create a Signaler themselves instead of using the DO wrapper to avoid the DO overhead.
|
|
89
89
|
*/
|
|
90
|
-
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
91
90
|
export class SignalManager extends DataObject {
|
|
92
91
|
get manager() {
|
|
93
92
|
assert(this._manager !== undefined, 0x24b /* "internal signaler should be defined" */);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signalManager.js","sourceRoot":"","sources":["../../src/signalManager/signalManager.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 } from \"events\";\nimport { DataObject, DataObjectFactory } from \"@fluidframework/aqueduct\";\nimport { IErrorEvent } from \"@fluidframework/common-definitions\";\nimport { assert, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport { Jsonable } from \"@fluidframework/datastore-definitions\";\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\nexport type SignalListener = (clientId: string, local: boolean, payload: Jsonable) => 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 */\nexport interface ISignaler {\n /**\n * Adds a listener for the specified signal. It behaves in the same way as EventEmitter's `on`\n * method regarding multiple registrations, callback order, etc.\n * @param signalName - The name of the signal\n * @param listener - The callback signal handler to add\n * @returns This ISignaler\n */\n onSignal(signalName: string, listener: SignalListener): ISignaler;\n /**\n * Remove a listener for the specified signal. It behaves in the same way as EventEmitter's\n * `off` method regarding multiple registrations, removal order, etc.\n * @param signalName - The name of the signal\n * @param listener - The callback signal handler to remove\n * @returns This ISignaler\n */\n offSignal(signalName: string, listener: SignalListener | ((message: any) => void)): ISignaler;\n /**\n * Send a signal with payload to its connected listeners.\n * @param signalName - The name of the signal\n * @param payload - The data to send with the signal\n */\n submitSignal(signalName: string, payload?: Jsonable);\n\n /**\n * Adds a listener for a broadcast request. The listener is called when a client calls\n * `requestBroadcast` for that signal. It behaves in the same way as EventEmitter's `on`\n * method regarding multiple registrations, callback order, etc.\n * @param signalName - The signal for which broadcast is requested\n * @param listener - The callback for the broadcast request to add\n * @returns This ISignaler\n */\n onBroadcastRequested(signalName: string, listener: SignalListener): ISignaler;\n /**\n * Remove a listener for a broadcast request. It behaves in the same way as EventEmitter's\n * `off` method regarding multiple registrations, removal order, etc.\n * @param signalName - The signal for which broadcast is requested\n * @param listener - The callback for the broadcast request to remove\n * @returns This ISignaler\n */\n offBroadcastRequested(signalName: string, listener: SignalListener): ISignaler;\n /**\n * Request broadcast of a signal from other connected clients. Other clients must have\n * registered to respond to broadcast requests using the `onBroadcastRequested` method.\n * @param signalName - The signal for which broadcast is requested\n * @param payload - A payload to send with the broadcast request\n */\n requestBroadcast(signalName: string, payload?: Jsonable);\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 */\nexport interface IRuntimeSignaler {\n connected: boolean;\n on(event: \"signal\", listener: (message: IInboundSignalMessage, local: boolean) => void);\n submitSignal(type: string, content: any): void;\n}\n\n/**\n * Note: currently experimental and under development\n *\n * Helper class to assist common scenarios around working with signals. Signaler 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 */\nexport class Signaler extends TypedEventEmitter<IErrorEvent> implements ISignaler {\n private readonly emitter = new EventEmitter();\n\n private readonly managerId: string | undefined;\n\n constructor(\n /**\n * Object to wrap that can submit and listen to signals\n */\n private readonly signaler: IRuntimeSignaler,\n /**\n * Optional id to assign to this manager that will be attached to\n * signal names. Useful to avoid collisions if there are multiple\n * signal users at the Container level\n */\n managerId?: string,\n ) {\n super();\n this.emitter.on(\"error\", (error) => {\n this.emit(\"error\", error);\n });\n this.managerId = managerId ? `#${managerId}` : undefined;\n this.signaler.on(\"signal\", (message: IInboundSignalMessage, local: boolean) => {\n const clientId = message.clientId;\n // Only call listeners when the runtime is connected and if the signal has an\n // identifiable sender clientId. The listener is responsible for deciding how\n // it wants to handle local/remote signals\n // eslint-disable-next-line no-null/no-null\n if (this.signaler.connected && clientId !== null) {\n this.emitter.emit(message.type, clientId, local, message.content);\n }\n });\n }\n\n private getManagerSignalName(signalName: string): string {\n return this.managerId ? `${signalName}${this.managerId}` : signalName;\n }\n\n private getBroadcastSignalName(signalName: string): string {\n return `${signalName}#req`;\n }\n\n // ISignaler methods\n\n public onSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const managerSignalName = this.getManagerSignalName(signalName);\n this.emitter.on(managerSignalName, listener);\n return this;\n }\n\n public offSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const managerSignalName = this.getManagerSignalName(signalName);\n this.emitter.off(managerSignalName, listener);\n return this;\n }\n\n public submitSignal(\n signalName: string,\n payload?: Jsonable,\n ) {\n const managerSignalName = this.getManagerSignalName(signalName);\n if (this.signaler.connected) {\n this.signaler.submitSignal(managerSignalName, payload);\n }\n }\n\n public onBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const broadcastSignalName = this.getBroadcastSignalName(signalName);\n return this.onSignal(broadcastSignalName, listener);\n }\n\n public offBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const broadcastSignalName = this.getBroadcastSignalName(signalName);\n return this.offSignal(broadcastSignalName, listener);\n }\n\n public requestBroadcast(\n signalName: string,\n payload?: Jsonable,\n ) {\n const broadcastSignalName = this.getBroadcastSignalName(signalName);\n this.submitSignal(broadcastSignalName, payload);\n }\n}\n\n/**\n * Note: currently experimental and under development\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. Where possible, consumers should instead\n * create a Signaler themselves instead of using the DO wrapper to avoid the DO overhead.\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport class SignalManager extends DataObject<{}, undefined, IErrorEvent> implements EventEmitter, ISignaler {\n private _manager: Signaler | undefined;\n private get manager(): Signaler {\n assert(this._manager !== undefined, 0x24b /* \"internal signaler should be defined\" */);\n return this._manager;\n }\n\n public static get Name() { return \"@fluid-example/signal-manager\"; }\n\n public static readonly factory = new DataObjectFactory<SignalManager, undefined, undefined, IErrorEvent>\n (\n SignalManager.Name,\n SignalManager,\n [],\n {},\n );\n\n protected async hasInitialized() {\n this._manager = new Signaler(this.runtime);\n this.manager.on(\"error\", (error) => {\n this.emit(\"error\", error);\n });\n }\n\n // ISignaler methods Note these are all passthroughs\n\n public onSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.onSignal(signalName, listener);\n return this;\n }\n\n public offSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.offSignal(signalName, listener);\n return this;\n }\n\n public submitSignal(\n signalName: string,\n payload?: Jsonable,\n ) {\n this.manager.submitSignal(signalName, payload);\n }\n\n public onBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.onBroadcastRequested(signalName, listener);\n return this;\n }\n\n public offBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.offBroadcastRequested(signalName, listener);\n return this;\n }\n\n public requestBroadcast(\n signalName: string,\n payload?: Jsonable,\n ) {\n this.manager.requestBroadcast(signalName, payload);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"signalManager.js","sourceRoot":"","sources":["../../src/signalManager/signalManager.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 } from \"events\";\nimport { DataObject, DataObjectFactory } from \"@fluidframework/aqueduct\";\nimport { IErrorEvent } from \"@fluidframework/common-definitions\";\nimport { assert, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport { Jsonable } from \"@fluidframework/datastore-definitions\";\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\nexport type SignalListener = (clientId: string, local: boolean, payload: Jsonable) => 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 */\nexport interface ISignaler {\n /**\n * Adds a listener for the specified signal. It behaves in the same way as EventEmitter's `on`\n * method regarding multiple registrations, callback order, etc.\n * @param signalName - The name of the signal\n * @param listener - The callback signal handler to add\n * @returns This ISignaler\n */\n onSignal(signalName: string, listener: SignalListener): ISignaler;\n /**\n * Remove a listener for the specified signal. It behaves in the same way as EventEmitter's\n * `off` method regarding multiple registrations, removal order, etc.\n * @param signalName - The name of the signal\n * @param listener - The callback signal handler to remove\n * @returns This ISignaler\n */\n offSignal(signalName: string, listener: SignalListener | ((message: any) => void)): ISignaler;\n /**\n * Send a signal with payload to its connected listeners.\n * @param signalName - The name of the signal\n * @param payload - The data to send with the signal\n */\n submitSignal(signalName: string, payload?: Jsonable);\n\n /**\n * Adds a listener for a broadcast request. The listener is called when a client calls\n * `requestBroadcast` for that signal. It behaves in the same way as EventEmitter's `on`\n * method regarding multiple registrations, callback order, etc.\n * @param signalName - The signal for which broadcast is requested\n * @param listener - The callback for the broadcast request to add\n * @returns This ISignaler\n */\n onBroadcastRequested(signalName: string, listener: SignalListener): ISignaler;\n /**\n * Remove a listener for a broadcast request. It behaves in the same way as EventEmitter's\n * `off` method regarding multiple registrations, removal order, etc.\n * @param signalName - The signal for which broadcast is requested\n * @param listener - The callback for the broadcast request to remove\n * @returns This ISignaler\n */\n offBroadcastRequested(signalName: string, listener: SignalListener): ISignaler;\n /**\n * Request broadcast of a signal from other connected clients. Other clients must have\n * registered to respond to broadcast requests using the `onBroadcastRequested` method.\n * @param signalName - The signal for which broadcast is requested\n * @param payload - A payload to send with the broadcast request\n */\n requestBroadcast(signalName: string, payload?: Jsonable);\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 */\nexport interface IRuntimeSignaler {\n connected: boolean;\n on(event: \"signal\", listener: (message: IInboundSignalMessage, local: boolean) => void);\n submitSignal(type: string, content: any): void;\n}\n\n/**\n * Note: currently experimental and under development\n *\n * Helper class to assist common scenarios around working with signals. Signaler 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 */\nexport class Signaler extends TypedEventEmitter<IErrorEvent> implements ISignaler {\n private readonly emitter = new EventEmitter();\n\n private readonly managerId: string | undefined;\n\n constructor(\n /**\n * Object to wrap that can submit and listen to signals\n */\n private readonly signaler: IRuntimeSignaler,\n /**\n * Optional id to assign to this manager that will be attached to\n * signal names. Useful to avoid collisions if there are multiple\n * signal users at the Container level\n */\n managerId?: string,\n ) {\n super();\n this.emitter.on(\"error\", (error) => {\n this.emit(\"error\", error);\n });\n this.managerId = managerId ? `#${managerId}` : undefined;\n this.signaler.on(\"signal\", (message: IInboundSignalMessage, local: boolean) => {\n const clientId = message.clientId;\n // Only call listeners when the runtime is connected and if the signal has an\n // identifiable sender clientId. The listener is responsible for deciding how\n // it wants to handle local/remote signals\n // eslint-disable-next-line no-null/no-null\n if (this.signaler.connected && clientId !== null) {\n this.emitter.emit(message.type, clientId, local, message.content);\n }\n });\n }\n\n private getManagerSignalName(signalName: string): string {\n return this.managerId ? `${signalName}${this.managerId}` : signalName;\n }\n\n private getBroadcastSignalName(signalName: string): string {\n return `${signalName}#req`;\n }\n\n // ISignaler methods\n\n public onSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const managerSignalName = this.getManagerSignalName(signalName);\n this.emitter.on(managerSignalName, listener);\n return this;\n }\n\n public offSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const managerSignalName = this.getManagerSignalName(signalName);\n this.emitter.off(managerSignalName, listener);\n return this;\n }\n\n public submitSignal(\n signalName: string,\n payload?: Jsonable,\n ) {\n const managerSignalName = this.getManagerSignalName(signalName);\n if (this.signaler.connected) {\n this.signaler.submitSignal(managerSignalName, payload);\n }\n }\n\n public onBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const broadcastSignalName = this.getBroadcastSignalName(signalName);\n return this.onSignal(broadcastSignalName, listener);\n }\n\n public offBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const broadcastSignalName = this.getBroadcastSignalName(signalName);\n return this.offSignal(broadcastSignalName, listener);\n }\n\n public requestBroadcast(\n signalName: string,\n payload?: Jsonable,\n ) {\n const broadcastSignalName = this.getBroadcastSignalName(signalName);\n this.submitSignal(broadcastSignalName, payload);\n }\n}\n\n/**\n * Note: currently experimental and under development\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. Where possible, consumers should instead\n * create a Signaler themselves instead of using the DO wrapper to avoid the DO overhead.\n */\nexport class SignalManager extends DataObject<{Events: IErrorEvent}> implements EventEmitter, ISignaler {\n private _manager: Signaler | undefined;\n private get manager(): Signaler {\n assert(this._manager !== undefined, 0x24b /* \"internal signaler should be defined\" */);\n return this._manager;\n }\n\n public static get Name() { return \"@fluid-example/signal-manager\"; }\n\n public static readonly factory = new DataObjectFactory\n (\n SignalManager.Name,\n SignalManager,\n [],\n {},\n );\n\n protected async hasInitialized() {\n this._manager = new Signaler(this.runtime);\n this.manager.on(\"error\", (error) => {\n this.emit(\"error\", error);\n });\n }\n\n // ISignaler methods Note these are all passthroughs\n\n public onSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.onSignal(signalName, listener);\n return this;\n }\n\n public offSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.offSignal(signalName, listener);\n return this;\n }\n\n public submitSignal(\n signalName: string,\n payload?: Jsonable,\n ) {\n this.manager.submitSignal(signalName, payload);\n }\n\n public onBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.onBroadcastRequested(signalName, listener);\n return this;\n }\n\n public offBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.offBroadcastRequested(signalName, listener);\n return this;\n }\n\n public requestBroadcast(\n signalName: string,\n payload?: Jsonable,\n ) {\n this.manager.requestBroadcast(signalName, payload);\n }\n}\n"]}
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
/// <reference types="node" />
|
|
6
6
|
import { EventEmitter } from "events";
|
|
7
7
|
import { DataObject, DataObjectFactory } from "@fluidframework/aqueduct";
|
|
8
|
-
import { IEvent } from "@fluidframework/common-definitions";
|
|
9
8
|
import { IDirectoryValueChanged } from "@fluidframework/map";
|
|
10
9
|
/**
|
|
11
10
|
* IKeyValueDataObject describes the public API surface for our KeyValue DataObject.
|
|
@@ -39,7 +38,7 @@ export interface IKeyValueDataObject extends EventEmitter {
|
|
|
39
38
|
* The KeyValueDataObject is our data object that implements the IKeyValueDataObject interface.
|
|
40
39
|
*/
|
|
41
40
|
export declare class KeyValueDataObject extends DataObject implements IKeyValueDataObject {
|
|
42
|
-
static readonly factory: DataObjectFactory<KeyValueDataObject,
|
|
41
|
+
static readonly factory: DataObjectFactory<KeyValueDataObject, import("@fluidframework/aqueduct").DataObjectTypes>;
|
|
43
42
|
/**
|
|
44
43
|
* hasInitialized is run by each client as they load the DataObject. Here we use it to set up usage of the
|
|
45
44
|
* DataObject, by registering an event listener for changes in data.
|
|
@@ -54,5 +53,5 @@ export declare class KeyValueDataObject extends DataObject implements IKeyValueD
|
|
|
54
53
|
* The DataObjectFactory is used by Fluid Framework to instantiate our DataObject. We provide it with a unique name
|
|
55
54
|
* and the constructor it will call. In this scenario, the third and fourth arguments are not used.
|
|
56
55
|
*/
|
|
57
|
-
export declare const KeyValueInstantiationFactory: DataObjectFactory<KeyValueDataObject,
|
|
56
|
+
export declare const KeyValueInstantiationFactory: DataObjectFactory<KeyValueDataObject, import("@fluidframework/aqueduct").DataObjectTypes>;
|
|
58
57
|
//# sourceMappingURL=DataObject.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataObject.d.ts","sourceRoot":"","sources":["../../src/kvpair/DataObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"DataObject.d.ts","sourceRoot":"","sources":["../../src/kvpair/DataObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAiB,MAAM,qBAAqB,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACrD;;OAEG;IACH,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,GAAG,CAAC;IAE1B;;OAEG;IACH,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAEvC;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,IAAI,GAAG,IAAI,CAAC;IAE7E;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE,CAAC;IAEjB;;;OAGG;IACH,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,GAAG,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAA;CACxF;AAED;;GAEG;AACH,qBAAa,kBACT,SAAQ,UACR,YAAW,mBAAmB;IAC9B,gBAAuB,OAAO,4FAK5B;IAEF;;;OAGG;cACa,cAAc;IAMvB,GAAG,QAAS,MAAM,SAAS,GAAG,UAEnC;IAEK,GAAG,QAAS,MAAM,SAGvB;IAEK,IAAI,QAAO,MAAM,EAAE,CAExB;IAEK,KAAK,4BAA6B,MAAM,KAAK,OAAO,sBAezD;CACL;AAED;;;GAGG;AACH,eAAO,MAAM,4BAA4B,2FAA6B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataObject.js","sourceRoot":"","sources":["../../src/kvpair/DataObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"DataObject.js","sourceRoot":"","sources":["../../src/kvpair/DataObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAkCzE;;GAEG;AACH,MAAM,OAAO,kBACT,SAAQ,UAAU;IADtB;;QAoBW,QAAG,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC;QAEK,QAAG,GAAG,CAAC,GAAW,EAAE,EAAE;YACzB,+DAA+D;YAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC,CAAC;QAEK,SAAI,GAAG,GAAa,EAAE;YACzB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC;QAEK,UAAK,GAAG,CAAC,IAA4C,EAAgC,EAAE;YAC1F,IAAI,IAAI,GAAa,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE;gBACP,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;aACtB;iBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBACjC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;aACjB;iBAAM;gBACH,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;aACnC;YAED,MAAM,QAAQ,GAA2B,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO,CAAC,CAAC,OAAe,EAAE,EAAE;gBAC7B,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QACpB,CAAC,CAAC;IACN,CAAC;IAvCG;;;OAGG;IACO,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,OAAsB,EAAE,EAAE;YACpD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACP,CAAC;;AAfsB,0BAAO,GAAG,IAAI,iBAAiB,CAClD,qBAAqB,EACrB,kBAAkB,EAClB,EAAE,EACF,EAAE,CACL,CAAC;AA2CN;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,kBAAkB,CAAC,OAAO,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { EventEmitter } from \"events\";\nimport { DataObject, DataObjectFactory } from \"@fluidframework/aqueduct\";\nimport { IDirectoryValueChanged, IValueChanged } from \"@fluidframework/map\";\n\n/**\n * IKeyValueDataObject describes the public API surface for our KeyValue DataObject.\n */\nexport interface IKeyValueDataObject extends EventEmitter {\n /**\n * Get value at Key\n */\n get: (key: string) => any;\n\n /**\n * Set Value at Key\n */\n set: (key: string, value: any) => void;\n\n /**\n * Event on value change\n */\n on(event: \"changed\", listener: (args: IDirectoryValueChanged) => void): this;\n\n /**\n * Returns all the keys\n */\n keys(): string[];\n\n /**\n * By default, returns an object containing all key value pairs\n * Filter test function can be passed to limit keys added to object\n */\n query: (test?: string | ((value: string) => boolean)) => any | { [key: string]: any }\n}\n\n/**\n * The KeyValueDataObject is our data object that implements the IKeyValueDataObject interface.\n */\nexport class KeyValueDataObject\n extends DataObject\n implements IKeyValueDataObject {\n public static readonly factory = new DataObjectFactory(\n \"keyvalue-dataobject\",\n KeyValueDataObject,\n [],\n {},\n );\n\n /**\n * hasInitialized is run by each client as they load the DataObject. Here we use it to set up usage of the\n * DataObject, by registering an event listener for changes in data.\n */\n protected async hasInitialized() {\n this.root.on(\"valueChanged\", (changed: IValueChanged) => {\n this.emit(\"changed\", changed);\n });\n }\n\n public set = (key: string, value: any) => {\n this.root.set(key, value);\n };\n\n public get = (key: string) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.root.get(key);\n };\n\n public keys = (): string[] => {\n return Array.from(this.root.keys());\n };\n\n public query = (test?: string | ((value: string) => boolean)): any | { [key: string]: any } => {\n let keys: string[] = [];\n if (!test) {\n keys = this.keys();\n } else if (typeof test === \"string\") {\n keys = [test];\n } else {\n keys = this.keys().filter(test);\n }\n\n const newQuery: { [key: string]: any } = {};\n keys.forEach((element: string) => {\n newQuery[element] = this.get(element);\n });\n return newQuery;\n };\n}\n\n/**\n * The DataObjectFactory is used by Fluid Framework to instantiate our DataObject. We provide it with a unique name\n * and the constructor it will call. In this scenario, the third and fourth arguments are not used.\n */\nexport const KeyValueInstantiationFactory = KeyValueDataObject.factory;\n"]}
|
|
@@ -115,11 +115,15 @@ export declare class Signaler extends TypedEventEmitter<IErrorEvent> implements
|
|
|
115
115
|
* users to get an ISignaler without a custom DO. Where possible, consumers should instead
|
|
116
116
|
* create a Signaler themselves instead of using the DO wrapper to avoid the DO overhead.
|
|
117
117
|
*/
|
|
118
|
-
export declare class SignalManager extends DataObject<{
|
|
118
|
+
export declare class SignalManager extends DataObject<{
|
|
119
|
+
Events: IErrorEvent;
|
|
120
|
+
}> implements EventEmitter, ISignaler {
|
|
119
121
|
private _manager;
|
|
120
122
|
private get manager();
|
|
121
123
|
static get Name(): string;
|
|
122
|
-
static readonly factory: DataObjectFactory<SignalManager,
|
|
124
|
+
static readonly factory: DataObjectFactory<SignalManager, {
|
|
125
|
+
Events: IErrorEvent;
|
|
126
|
+
}>;
|
|
123
127
|
protected hasInitialized(): Promise<void>;
|
|
124
128
|
onSignal(signalName: string, listener: SignalListener): ISignaler;
|
|
125
129
|
offSignal(signalName: string, listener: SignalListener): ISignaler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signalManager.d.ts","sourceRoot":"","sources":["../../src/signalManager/signalManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAU,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAM5E,oBAAY,cAAc,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;AAE3F;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC;IACjE;;;;;;MAME;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9F;;;;OAIG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,OAAE;IAErD;;;;;;;OAOG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC;IAC9E;;;;;;OAMG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC;IAC/E;;;;;OAKG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,OAAE;CAC5D;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,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,GAAG,GAAG,IAAI,CAAC;CAClD;AAED;;;;;;;;GAQG;AACH,qBAAa,QAAS,SAAQ,iBAAiB,CAAC,WAAW,CAAE,YAAW,SAAS;IAMzE;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAE/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;;IAG3C;;OAEG;IACc,QAAQ,EAAE,gBAAgB;IAC3C;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM;IAmBtB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,sBAAsB;IAMvB,QAAQ,CACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,GACzB,SAAS;IAML,SAAS,CACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,GACzB,SAAS;IAML,YAAY,CACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,QAAQ;IAQf,oBAAoB,CACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,GACzB,SAAS;IAKL,qBAAqB,CACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,GACzB,SAAS;IAKL,gBAAgB,CACnB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,QAAQ;CAKzB;AAED;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"signalManager.d.ts","sourceRoot":"","sources":["../../src/signalManager/signalManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -87,7 +87,6 @@ export class Signaler extends TypedEventEmitter {
|
|
|
87
87
|
* users to get an ISignaler without a custom DO. Where possible, consumers should instead
|
|
88
88
|
* create a Signaler themselves instead of using the DO wrapper to avoid the DO overhead.
|
|
89
89
|
*/
|
|
90
|
-
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
91
90
|
export class SignalManager extends DataObject {
|
|
92
91
|
get manager() {
|
|
93
92
|
assert(this._manager !== undefined, 0x24b /* "internal signaler should be defined" */);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signalManager.js","sourceRoot":"","sources":["../../src/signalManager/signalManager.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 } from \"events\";\nimport { DataObject, DataObjectFactory } from \"@fluidframework/aqueduct\";\nimport { IErrorEvent } from \"@fluidframework/common-definitions\";\nimport { assert, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport { Jsonable } from \"@fluidframework/datastore-definitions\";\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\nexport type SignalListener = (clientId: string, local: boolean, payload: Jsonable) => 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 */\nexport interface ISignaler {\n /**\n * Adds a listener for the specified signal. It behaves in the same way as EventEmitter's `on`\n * method regarding multiple registrations, callback order, etc.\n * @param signalName - The name of the signal\n * @param listener - The callback signal handler to add\n * @returns This ISignaler\n */\n onSignal(signalName: string, listener: SignalListener): ISignaler;\n /**\n * Remove a listener for the specified signal. It behaves in the same way as EventEmitter's\n * `off` method regarding multiple registrations, removal order, etc.\n * @param signalName - The name of the signal\n * @param listener - The callback signal handler to remove\n * @returns This ISignaler\n */\n offSignal(signalName: string, listener: SignalListener | ((message: any) => void)): ISignaler;\n /**\n * Send a signal with payload to its connected listeners.\n * @param signalName - The name of the signal\n * @param payload - The data to send with the signal\n */\n submitSignal(signalName: string, payload?: Jsonable);\n\n /**\n * Adds a listener for a broadcast request. The listener is called when a client calls\n * `requestBroadcast` for that signal. It behaves in the same way as EventEmitter's `on`\n * method regarding multiple registrations, callback order, etc.\n * @param signalName - The signal for which broadcast is requested\n * @param listener - The callback for the broadcast request to add\n * @returns This ISignaler\n */\n onBroadcastRequested(signalName: string, listener: SignalListener): ISignaler;\n /**\n * Remove a listener for a broadcast request. It behaves in the same way as EventEmitter's\n * `off` method regarding multiple registrations, removal order, etc.\n * @param signalName - The signal for which broadcast is requested\n * @param listener - The callback for the broadcast request to remove\n * @returns This ISignaler\n */\n offBroadcastRequested(signalName: string, listener: SignalListener): ISignaler;\n /**\n * Request broadcast of a signal from other connected clients. Other clients must have\n * registered to respond to broadcast requests using the `onBroadcastRequested` method.\n * @param signalName - The signal for which broadcast is requested\n * @param payload - A payload to send with the broadcast request\n */\n requestBroadcast(signalName: string, payload?: Jsonable);\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 */\nexport interface IRuntimeSignaler {\n connected: boolean;\n on(event: \"signal\", listener: (message: IInboundSignalMessage, local: boolean) => void);\n submitSignal(type: string, content: any): void;\n}\n\n/**\n * Note: currently experimental and under development\n *\n * Helper class to assist common scenarios around working with signals. Signaler 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 */\nexport class Signaler extends TypedEventEmitter<IErrorEvent> implements ISignaler {\n private readonly emitter = new EventEmitter();\n\n private readonly managerId: string | undefined;\n\n constructor(\n /**\n * Object to wrap that can submit and listen to signals\n */\n private readonly signaler: IRuntimeSignaler,\n /**\n * Optional id to assign to this manager that will be attached to\n * signal names. Useful to avoid collisions if there are multiple\n * signal users at the Container level\n */\n managerId?: string,\n ) {\n super();\n this.emitter.on(\"error\", (error) => {\n this.emit(\"error\", error);\n });\n this.managerId = managerId ? `#${managerId}` : undefined;\n this.signaler.on(\"signal\", (message: IInboundSignalMessage, local: boolean) => {\n const clientId = message.clientId;\n // Only call listeners when the runtime is connected and if the signal has an\n // identifiable sender clientId. The listener is responsible for deciding how\n // it wants to handle local/remote signals\n // eslint-disable-next-line no-null/no-null\n if (this.signaler.connected && clientId !== null) {\n this.emitter.emit(message.type, clientId, local, message.content);\n }\n });\n }\n\n private getManagerSignalName(signalName: string): string {\n return this.managerId ? `${signalName}${this.managerId}` : signalName;\n }\n\n private getBroadcastSignalName(signalName: string): string {\n return `${signalName}#req`;\n }\n\n // ISignaler methods\n\n public onSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const managerSignalName = this.getManagerSignalName(signalName);\n this.emitter.on(managerSignalName, listener);\n return this;\n }\n\n public offSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const managerSignalName = this.getManagerSignalName(signalName);\n this.emitter.off(managerSignalName, listener);\n return this;\n }\n\n public submitSignal(\n signalName: string,\n payload?: Jsonable,\n ) {\n const managerSignalName = this.getManagerSignalName(signalName);\n if (this.signaler.connected) {\n this.signaler.submitSignal(managerSignalName, payload);\n }\n }\n\n public onBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const broadcastSignalName = this.getBroadcastSignalName(signalName);\n return this.onSignal(broadcastSignalName, listener);\n }\n\n public offBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const broadcastSignalName = this.getBroadcastSignalName(signalName);\n return this.offSignal(broadcastSignalName, listener);\n }\n\n public requestBroadcast(\n signalName: string,\n payload?: Jsonable,\n ) {\n const broadcastSignalName = this.getBroadcastSignalName(signalName);\n this.submitSignal(broadcastSignalName, payload);\n }\n}\n\n/**\n * Note: currently experimental and under development\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. Where possible, consumers should instead\n * create a Signaler themselves instead of using the DO wrapper to avoid the DO overhead.\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport class SignalManager extends DataObject<{}, undefined, IErrorEvent> implements EventEmitter, ISignaler {\n private _manager: Signaler | undefined;\n private get manager(): Signaler {\n assert(this._manager !== undefined, 0x24b /* \"internal signaler should be defined\" */);\n return this._manager;\n }\n\n public static get Name() { return \"@fluid-example/signal-manager\"; }\n\n public static readonly factory = new DataObjectFactory<SignalManager, undefined, undefined, IErrorEvent>\n (\n SignalManager.Name,\n SignalManager,\n [],\n {},\n );\n\n protected async hasInitialized() {\n this._manager = new Signaler(this.runtime);\n this.manager.on(\"error\", (error) => {\n this.emit(\"error\", error);\n });\n }\n\n // ISignaler methods Note these are all passthroughs\n\n public onSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.onSignal(signalName, listener);\n return this;\n }\n\n public offSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.offSignal(signalName, listener);\n return this;\n }\n\n public submitSignal(\n signalName: string,\n payload?: Jsonable,\n ) {\n this.manager.submitSignal(signalName, payload);\n }\n\n public onBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.onBroadcastRequested(signalName, listener);\n return this;\n }\n\n public offBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.offBroadcastRequested(signalName, listener);\n return this;\n }\n\n public requestBroadcast(\n signalName: string,\n payload?: Jsonable,\n ) {\n this.manager.requestBroadcast(signalName, payload);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"signalManager.js","sourceRoot":"","sources":["../../src/signalManager/signalManager.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 } from \"events\";\nimport { DataObject, DataObjectFactory } from \"@fluidframework/aqueduct\";\nimport { IErrorEvent } from \"@fluidframework/common-definitions\";\nimport { assert, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport { Jsonable } from \"@fluidframework/datastore-definitions\";\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\nexport type SignalListener = (clientId: string, local: boolean, payload: Jsonable) => 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 */\nexport interface ISignaler {\n /**\n * Adds a listener for the specified signal. It behaves in the same way as EventEmitter's `on`\n * method regarding multiple registrations, callback order, etc.\n * @param signalName - The name of the signal\n * @param listener - The callback signal handler to add\n * @returns This ISignaler\n */\n onSignal(signalName: string, listener: SignalListener): ISignaler;\n /**\n * Remove a listener for the specified signal. It behaves in the same way as EventEmitter's\n * `off` method regarding multiple registrations, removal order, etc.\n * @param signalName - The name of the signal\n * @param listener - The callback signal handler to remove\n * @returns This ISignaler\n */\n offSignal(signalName: string, listener: SignalListener | ((message: any) => void)): ISignaler;\n /**\n * Send a signal with payload to its connected listeners.\n * @param signalName - The name of the signal\n * @param payload - The data to send with the signal\n */\n submitSignal(signalName: string, payload?: Jsonable);\n\n /**\n * Adds a listener for a broadcast request. The listener is called when a client calls\n * `requestBroadcast` for that signal. It behaves in the same way as EventEmitter's `on`\n * method regarding multiple registrations, callback order, etc.\n * @param signalName - The signal for which broadcast is requested\n * @param listener - The callback for the broadcast request to add\n * @returns This ISignaler\n */\n onBroadcastRequested(signalName: string, listener: SignalListener): ISignaler;\n /**\n * Remove a listener for a broadcast request. It behaves in the same way as EventEmitter's\n * `off` method regarding multiple registrations, removal order, etc.\n * @param signalName - The signal for which broadcast is requested\n * @param listener - The callback for the broadcast request to remove\n * @returns This ISignaler\n */\n offBroadcastRequested(signalName: string, listener: SignalListener): ISignaler;\n /**\n * Request broadcast of a signal from other connected clients. Other clients must have\n * registered to respond to broadcast requests using the `onBroadcastRequested` method.\n * @param signalName - The signal for which broadcast is requested\n * @param payload - A payload to send with the broadcast request\n */\n requestBroadcast(signalName: string, payload?: Jsonable);\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 */\nexport interface IRuntimeSignaler {\n connected: boolean;\n on(event: \"signal\", listener: (message: IInboundSignalMessage, local: boolean) => void);\n submitSignal(type: string, content: any): void;\n}\n\n/**\n * Note: currently experimental and under development\n *\n * Helper class to assist common scenarios around working with signals. Signaler 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 */\nexport class Signaler extends TypedEventEmitter<IErrorEvent> implements ISignaler {\n private readonly emitter = new EventEmitter();\n\n private readonly managerId: string | undefined;\n\n constructor(\n /**\n * Object to wrap that can submit and listen to signals\n */\n private readonly signaler: IRuntimeSignaler,\n /**\n * Optional id to assign to this manager that will be attached to\n * signal names. Useful to avoid collisions if there are multiple\n * signal users at the Container level\n */\n managerId?: string,\n ) {\n super();\n this.emitter.on(\"error\", (error) => {\n this.emit(\"error\", error);\n });\n this.managerId = managerId ? `#${managerId}` : undefined;\n this.signaler.on(\"signal\", (message: IInboundSignalMessage, local: boolean) => {\n const clientId = message.clientId;\n // Only call listeners when the runtime is connected and if the signal has an\n // identifiable sender clientId. The listener is responsible for deciding how\n // it wants to handle local/remote signals\n // eslint-disable-next-line no-null/no-null\n if (this.signaler.connected && clientId !== null) {\n this.emitter.emit(message.type, clientId, local, message.content);\n }\n });\n }\n\n private getManagerSignalName(signalName: string): string {\n return this.managerId ? `${signalName}${this.managerId}` : signalName;\n }\n\n private getBroadcastSignalName(signalName: string): string {\n return `${signalName}#req`;\n }\n\n // ISignaler methods\n\n public onSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const managerSignalName = this.getManagerSignalName(signalName);\n this.emitter.on(managerSignalName, listener);\n return this;\n }\n\n public offSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const managerSignalName = this.getManagerSignalName(signalName);\n this.emitter.off(managerSignalName, listener);\n return this;\n }\n\n public submitSignal(\n signalName: string,\n payload?: Jsonable,\n ) {\n const managerSignalName = this.getManagerSignalName(signalName);\n if (this.signaler.connected) {\n this.signaler.submitSignal(managerSignalName, payload);\n }\n }\n\n public onBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const broadcastSignalName = this.getBroadcastSignalName(signalName);\n return this.onSignal(broadcastSignalName, listener);\n }\n\n public offBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n const broadcastSignalName = this.getBroadcastSignalName(signalName);\n return this.offSignal(broadcastSignalName, listener);\n }\n\n public requestBroadcast(\n signalName: string,\n payload?: Jsonable,\n ) {\n const broadcastSignalName = this.getBroadcastSignalName(signalName);\n this.submitSignal(broadcastSignalName, payload);\n }\n}\n\n/**\n * Note: currently experimental and under development\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. Where possible, consumers should instead\n * create a Signaler themselves instead of using the DO wrapper to avoid the DO overhead.\n */\nexport class SignalManager extends DataObject<{Events: IErrorEvent}> implements EventEmitter, ISignaler {\n private _manager: Signaler | undefined;\n private get manager(): Signaler {\n assert(this._manager !== undefined, 0x24b /* \"internal signaler should be defined\" */);\n return this._manager;\n }\n\n public static get Name() { return \"@fluid-example/signal-manager\"; }\n\n public static readonly factory = new DataObjectFactory\n (\n SignalManager.Name,\n SignalManager,\n [],\n {},\n );\n\n protected async hasInitialized() {\n this._manager = new Signaler(this.runtime);\n this.manager.on(\"error\", (error) => {\n this.emit(\"error\", error);\n });\n }\n\n // ISignaler methods Note these are all passthroughs\n\n public onSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.onSignal(signalName, listener);\n return this;\n }\n\n public offSignal(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.offSignal(signalName, listener);\n return this;\n }\n\n public submitSignal(\n signalName: string,\n payload?: Jsonable,\n ) {\n this.manager.submitSignal(signalName, payload);\n }\n\n public onBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.onBroadcastRequested(signalName, listener);\n return this;\n }\n\n public offBroadcastRequested(\n signalName: string,\n listener: SignalListener,\n ): ISignaler {\n this.manager.offBroadcastRequested(signalName, listener);\n return this;\n }\n\n public requestBroadcast(\n signalName: string,\n payload?: Jsonable,\n ) {\n this.manager.requestBroadcast(signalName, payload);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluid-experimental/data-objects",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.53.0-46105",
|
|
4
4
|
"description": "A collection of ready to use Fluid Data Objects",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": "https://github.com/microsoft/FluidFramework",
|
|
@@ -27,12 +27,12 @@
|
|
|
27
27
|
"tsfmt:fix": "tsfmt --replace"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@fluidframework/aqueduct": "
|
|
30
|
+
"@fluidframework/aqueduct": "0.53.0-46105",
|
|
31
31
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
32
32
|
"@fluidframework/common-utils": "^0.32.1",
|
|
33
|
-
"@fluidframework/datastore-definitions": "
|
|
34
|
-
"@fluidframework/map": "
|
|
35
|
-
"@fluidframework/runtime-definitions": "
|
|
33
|
+
"@fluidframework/datastore-definitions": "0.53.0-46105",
|
|
34
|
+
"@fluidframework/map": "0.53.0-46105",
|
|
35
|
+
"@fluidframework/runtime-definitions": "0.53.0-46105"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@fluidframework/build-common": "^0.23.0",
|
package/src/kvpair/DataObject.ts
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
|
|
6
6
|
import { EventEmitter } from "events";
|
|
7
7
|
import { DataObject, DataObjectFactory } from "@fluidframework/aqueduct";
|
|
8
|
-
import { IEvent } from "@fluidframework/common-definitions";
|
|
9
8
|
import { IDirectoryValueChanged, IValueChanged } from "@fluidframework/map";
|
|
10
9
|
|
|
11
10
|
/**
|
|
@@ -45,7 +44,7 @@ export interface IKeyValueDataObject extends EventEmitter {
|
|
|
45
44
|
export class KeyValueDataObject
|
|
46
45
|
extends DataObject
|
|
47
46
|
implements IKeyValueDataObject {
|
|
48
|
-
public static readonly factory = new DataObjectFactory
|
|
47
|
+
public static readonly factory = new DataObjectFactory(
|
|
49
48
|
"keyvalue-dataobject",
|
|
50
49
|
KeyValueDataObject,
|
|
51
50
|
[],
|
|
@@ -194,8 +194,7 @@ export class Signaler extends TypedEventEmitter<IErrorEvent> implements ISignale
|
|
|
194
194
|
* users to get an ISignaler without a custom DO. Where possible, consumers should instead
|
|
195
195
|
* create a Signaler themselves instead of using the DO wrapper to avoid the DO overhead.
|
|
196
196
|
*/
|
|
197
|
-
|
|
198
|
-
export class SignalManager extends DataObject<{}, undefined, IErrorEvent> implements EventEmitter, ISignaler {
|
|
197
|
+
export class SignalManager extends DataObject<{Events: IErrorEvent}> implements EventEmitter, ISignaler {
|
|
199
198
|
private _manager: Signaler | undefined;
|
|
200
199
|
private get manager(): Signaler {
|
|
201
200
|
assert(this._manager !== undefined, 0x24b /* "internal signaler should be defined" */);
|
|
@@ -204,7 +203,7 @@ export class SignalManager extends DataObject<{}, undefined, IErrorEvent> implem
|
|
|
204
203
|
|
|
205
204
|
public static get Name() { return "@fluid-example/signal-manager"; }
|
|
206
205
|
|
|
207
|
-
public static readonly factory = new DataObjectFactory
|
|
206
|
+
public static readonly factory = new DataObjectFactory
|
|
208
207
|
(
|
|
209
208
|
SignalManager.Name,
|
|
210
209
|
SignalManager,
|