@fluidframework/legacy-dds 2.53.1 → 2.60.0
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/api-report/{legacy-dds.legacy.alpha.api.md → legacy-dds.legacy.beta.api.md} +20 -20
- package/dist/array/interfaces.d.ts +4 -8
- package/dist/array/interfaces.d.ts.map +1 -1
- package/dist/array/interfaces.js.map +1 -1
- package/dist/array/sharedArray.d.ts +8 -0
- package/dist/array/sharedArray.d.ts.map +1 -1
- package/dist/array/sharedArray.js +108 -8
- package/dist/array/sharedArray.js.map +1 -1
- package/dist/array/sharedArrayFactory.d.ts +2 -4
- package/dist/array/sharedArrayFactory.d.ts.map +1 -1
- package/dist/array/sharedArrayFactory.js +2 -4
- package/dist/array/sharedArrayFactory.js.map +1 -1
- package/dist/array/sharedArrayOperations.d.ts +9 -18
- package/dist/array/sharedArrayOperations.d.ts.map +1 -1
- package/dist/array/sharedArrayOperations.js +1 -2
- package/dist/array/sharedArrayOperations.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/signal/interfaces.d.ts +3 -6
- package/dist/signal/interfaces.d.ts.map +1 -1
- package/dist/signal/interfaces.js.map +1 -1
- package/dist/signal/sharedSignal.d.ts.map +1 -1
- package/dist/signal/sharedSignal.js +19 -9
- package/dist/signal/sharedSignal.js.map +1 -1
- package/dist/signal/sharedSignalFactory.d.ts +1 -2
- package/dist/signal/sharedSignalFactory.d.ts.map +1 -1
- package/dist/signal/sharedSignalFactory.js +1 -2
- package/dist/signal/sharedSignalFactory.js.map +1 -1
- package/lib/array/interfaces.d.ts +4 -8
- package/lib/array/interfaces.d.ts.map +1 -1
- package/lib/array/interfaces.js.map +1 -1
- package/lib/array/sharedArray.d.ts +8 -0
- package/lib/array/sharedArray.d.ts.map +1 -1
- package/lib/array/sharedArray.js +108 -8
- package/lib/array/sharedArray.js.map +1 -1
- package/lib/array/sharedArrayFactory.d.ts +2 -4
- package/lib/array/sharedArrayFactory.d.ts.map +1 -1
- package/lib/array/sharedArrayFactory.js +2 -4
- package/lib/array/sharedArrayFactory.js.map +1 -1
- package/lib/array/sharedArrayOperations.d.ts +9 -18
- package/lib/array/sharedArrayOperations.d.ts.map +1 -1
- package/lib/array/sharedArrayOperations.js +1 -2
- package/lib/array/sharedArrayOperations.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/signal/interfaces.d.ts +3 -6
- package/lib/signal/interfaces.d.ts.map +1 -1
- package/lib/signal/interfaces.js.map +1 -1
- package/lib/signal/sharedSignal.d.ts.map +1 -1
- package/lib/signal/sharedSignal.js +11 -1
- package/lib/signal/sharedSignal.js.map +1 -1
- package/lib/signal/sharedSignalFactory.d.ts +1 -2
- package/lib/signal/sharedSignalFactory.d.ts.map +1 -1
- package/lib/signal/sharedSignalFactory.js +1 -2
- package/lib/signal/sharedSignalFactory.js.map +1 -1
- package/package.json +16 -16
- package/src/array/interfaces.ts +4 -8
- package/src/array/sharedArray.ts +120 -10
- package/src/array/sharedArrayFactory.ts +2 -4
- package/src/array/sharedArrayOperations.ts +9 -18
- package/src/packageVersion.ts +1 -1
- package/src/signal/interfaces.ts +3 -6
- package/src/signal/sharedSignal.ts +11 -2
- package/src/signal/sharedSignalFactory.ts +1 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharedSignal.js","sourceRoot":"","sources":["../../src/signal/sharedSignal.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"sharedSignal.js","sourceRoot":"","sources":["../../src/signal/sharedSignal.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\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { FileMode, MessageType, TreeEntry } from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tISequencedDocumentMessage,\n\tITree,\n} from \"@fluidframework/driver-definitions/internal\";\nimport type { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions/internal\";\nimport { convertToSummaryTreeWithStats } from \"@fluidframework/runtime-utils/internal\";\nimport type { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\nimport { SharedObject } from \"@fluidframework/shared-object-base/internal\";\n\nimport type {\n\tISharedSignal,\n\tISharedSignalEvents,\n\tISignalOperation,\n\tSerializableTypeForSharedSignal,\n} from \"./interfaces.js\";\nimport { SharedSignalFactory } from \"./sharedSignalFactory.js\";\n\nconst snapshotFileName = \"header\";\n\n/**\n * Represents a shared signal that allows communication between distributed clients.\n *\n * @internal\n */\nexport class SharedSignalClass<T extends SerializableTypeForSharedSignal = any>\n\textends SharedObject<ISharedSignalEvents<T>>\n\timplements ISharedSignal<T>\n{\n\t/**\n\t * Create a new shared signal\n\t *\n\t * @param runtime - data store runtime the new shared signal belongs to\n\t * @param id - optional name of the shared signal\n\t * @returns newly create shared signal (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string): SharedSignalClass {\n\t\treturn runtime.createChannel(id, SharedSignalFactory.Type) as SharedSignalClass;\n\t}\n\n\t/**\n\t * Get a factory for SharedSignal to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedSignal\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new SharedSignalFactory();\n\t}\n\n\t/**\n\t * Constructs a new shared signal. If the object is non-local an id and service interfaces will\n\t * be provided\n\t * @param id - optional name of the shared signal\n\t * @param runtime - data store runtime the shared signal belongs to\n\t * @param attributes - represents the attributes of a channel/DDS.\n\t */\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(id, runtime, attributes, \"loop_sharedSignal_\" /* telemetryContextPrefix */);\n\t}\n\n\t/**\n\t * Method used for generating a signal.\n\t */\n\tpublic notify(metadata?: T): void {\n\t\t// If we are not attached, don't submit the op.\n\t\tif (!this.isAttached()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst op: ISignalOperation<T> = {\n\t\t\ttype: \"signal\",\n\t\t\tmetadata,\n\t\t};\n\n\t\tthis.notifyCore(op, true);\n\n\t\tthis.submitLocalMessage(op);\n\t}\n\n\tprotected summarizeCore(_serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\tconst tree: ITree = {\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tmode: FileMode.File,\n\t\t\t\t\tpath: snapshotFileName,\n\t\t\t\t\ttype: TreeEntry[TreeEntry.Blob],\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tcontents: JSON.stringify(\"\"),\n\t\t\t\t\t\t// eslint-disable-next-line unicorn/text-encoding-identifier-case\n\t\t\t\t\t\tencoding: \"utf-8\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\n\t\tconst summaryTreeWithStats = convertToSummaryTreeWithStats(tree);\n\n\t\treturn summaryTreeWithStats;\n\t}\n\n\t/**\n\t * Load share signal from snapshot\n\t *\n\t * @param _storage - the storage to get the snapshot from\n\t * @returns - promise that resolved when the load is completed\n\t */\n\tprotected async loadCore(_storage: IChannelStorageService): Promise<void> {}\n\n\tprotected override initializeLocalCore(): void {}\n\n\t/**\n\t * Callback on disconnect\n\t */\n\tprotected onDisconnect(): void {}\n\n\t/**\n\t * Process a shared signal operation\n\t *\n\t * @param message - the message to prepare\n\t * @param local - whether the message was sent by the local client\n\t * @param _localOpMetadata - For local client messages, this is the metadata that was submitted with the message.\n\t * For messages from a remote client, this will be undefined.\n\t */\n\tprotected processCore(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\t_localOpMetadata: unknown,\n\t): void {\n\t\tif ((message.type as MessageType) === MessageType.Operation && !local) {\n\t\t\tconst op = message.contents as ISignalOperation<T>;\n\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"signal\": {\n\t\t\t\t\tthis.notifyCore(op, local);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tthrow new Error(\"Unknown operation\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate notifyCore(op: ISignalOperation<T>, isLocal: boolean): void {\n\t\tthis.emit(\"notify\", op.metadata, isLocal);\n\t}\n\n\tprotected applyStashedOp(_content: unknown): void {\n\t\tconst op = _content as ISignalOperation<T>;\n\n\t\tswitch (op.type) {\n\t\t\tcase \"signal\": {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(op as never);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -17,8 +17,7 @@ export declare class SharedSignalFactory implements IChannelFactory<ISharedSigna
|
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
19
|
* Entrypoint for {@link ISharedSignal} creation.
|
|
20
|
-
* @legacy
|
|
21
|
-
* @alpha
|
|
20
|
+
* @legacy @beta
|
|
22
21
|
*/
|
|
23
22
|
export declare const SharedSignal: import("@fluidframework/shared-object-base/internal").ISharedObjectKind<ISharedSignal<any>> & import("@fluidframework/shared-object-base/internal").SharedObjectKind<ISharedSignal<any>>;
|
|
24
23
|
//# sourceMappingURL=sharedSignalFactory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharedSignalFactory.d.ts","sourceRoot":"","sources":["../../src/signal/sharedSignalFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACX,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,MAAM,gDAAgD,CAAC;AAKxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD;;GAEG;AACH,qBAAa,mBAAoB,YAAW,eAAe,CAAC,aAAa,CAAC;IACzE,gBAAuB,IAAI,EAAE,MAAM,CAA8C;IAEjF,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,kBAAkB,CAE1C;IAEY,IAAI,CAChB,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,aAAa,CAAC;IAMlB,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa;CAK1E;AAED
|
|
1
|
+
{"version":3,"file":"sharedSignalFactory.d.ts","sourceRoot":"","sources":["../../src/signal/sharedSignalFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACX,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,MAAM,gDAAgD,CAAC;AAKxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD;;GAEG;AACH,qBAAa,mBAAoB,YAAW,eAAe,CAAC,aAAa,CAAC;IACzE,gBAAuB,IAAI,EAAE,MAAM,CAA8C;IAEjF,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,kBAAkB,CAE1C;IAEY,IAAI,CAChB,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,aAAa,CAAC;IAMlB,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa;CAK1E;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,0LAA6D,CAAC"}
|
|
@@ -38,8 +38,7 @@ SharedSignalFactory.Attributes = {
|
|
|
38
38
|
};
|
|
39
39
|
/**
|
|
40
40
|
* Entrypoint for {@link ISharedSignal} creation.
|
|
41
|
-
* @legacy
|
|
42
|
-
* @alpha
|
|
41
|
+
* @legacy @beta
|
|
43
42
|
*/
|
|
44
43
|
exports.SharedSignal = (0, internal_1.createSharedObjectKind)(SharedSignalFactory);
|
|
45
44
|
//# sourceMappingURL=sharedSignalFactory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharedSignalFactory.js","sourceRoot":"","sources":["../../src/signal/sharedSignalFactory.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,0EAAqF;AAErF,4DAAkD;AAGlD,uDAAsD;AAEtD;;GAEG;AACH,MAAa,mBAAmB;IAS/B,IAAW,IAAI;QACd,OAAO,mBAAmB,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,mBAAmB,CAAC,UAAU,CAAC;IACvC,CAAC;IAEM,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,MAAM,MAAM,GAAG,IAAI,mCAAiB,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC;IACf,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,MAAM,MAAM,GAAG,IAAI,mCAAiB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpE,MAAM,CAAC,eAAe,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IACf,CAAC;;AAhCF,kDAiCC;AAhCuB,wBAAI,GAAW,0CAA0C,CAAC;AAE1D,8BAAU,GAAuB;IACvD,IAAI,EAAE,mBAAmB,CAAC,IAAI;IAC9B,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,8BAAU;CAC1B,CAAC;AA4BH
|
|
1
|
+
{"version":3,"file":"sharedSignalFactory.js","sourceRoot":"","sources":["../../src/signal/sharedSignalFactory.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,0EAAqF;AAErF,4DAAkD;AAGlD,uDAAsD;AAEtD;;GAEG;AACH,MAAa,mBAAmB;IAS/B,IAAW,IAAI;QACd,OAAO,mBAAmB,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,mBAAmB,CAAC,UAAU,CAAC;IACvC,CAAC;IAEM,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,MAAM,MAAM,GAAG,IAAI,mCAAiB,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC;IACf,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,MAAM,MAAM,GAAG,IAAI,mCAAiB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpE,MAAM,CAAC,eAAe,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IACf,CAAC;;AAhCF,kDAiCC;AAhCuB,wBAAI,GAAW,0CAA0C,CAAC;AAE1D,8BAAU,GAAuB;IACvD,IAAI,EAAE,mBAAmB,CAAC,IAAI;IAC9B,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,8BAAU;CAC1B,CAAC;AA4BH;;;GAGG;AACU,QAAA,YAAY,GAAG,IAAA,iCAAsB,EAAgB,mBAAmB,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelFactory,\n\tIChannelServices,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { createSharedObjectKind } from \"@fluidframework/shared-object-base/internal\";\n\nimport { pkgVersion } from \"../packageVersion.js\";\n\nimport type { ISharedSignal } from \"./interfaces.js\";\nimport { SharedSignalClass } from \"./sharedSignal.js\";\n\n/**\n * @internal\n */\nexport class SharedSignalFactory implements IChannelFactory<ISharedSignal> {\n\tpublic static readonly Type: string = \"https://graph.microsoft.com/types/signal\";\n\n\tpublic static readonly Attributes: IChannelAttributes = {\n\t\ttype: SharedSignalFactory.Type,\n\t\tsnapshotFormatVersion: \"0.1\",\n\t\tpackageVersion: pkgVersion,\n\t};\n\n\tpublic get type(): string {\n\t\treturn SharedSignalFactory.Type;\n\t}\n\n\tpublic get attributes(): IChannelAttributes {\n\t\treturn SharedSignalFactory.Attributes;\n\t}\n\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<ISharedSignal> {\n\t\tconst signal = new SharedSignalClass(id, runtime, attributes);\n\t\tawait signal.load(services);\n\t\treturn signal;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): ISharedSignal {\n\t\tconst signal = new SharedSignalClass(id, document, this.attributes);\n\t\tsignal.initializeLocal();\n\t\treturn signal;\n\t}\n}\n\n/**\n * Entrypoint for {@link ISharedSignal} creation.\n * @legacy @beta\n */\nexport const SharedSignal = createSharedObjectKind<ISharedSignal>(SharedSignalFactory);\n"]}
|
|
@@ -11,16 +11,14 @@ import type { ISharedArrayOperation } from "./sharedArrayOperations.js";
|
|
|
11
11
|
* It can be used as a generic constraint (`extends SerializableTypeForSharedArray`) but is
|
|
12
12
|
* *never* meant to be a concrete/real type on its own.
|
|
13
13
|
*
|
|
14
|
-
* @legacy
|
|
15
|
-
* @alpha
|
|
14
|
+
* @legacy @beta
|
|
16
15
|
*/
|
|
17
16
|
export type SerializableTypeForSharedArray = boolean | number | string | object | IFluidHandle;
|
|
18
17
|
/**
|
|
19
18
|
* Interface defining the events that can be emitted by the SharedArray DDS
|
|
20
19
|
* and the events that can be listened to by the SharedArray DDS
|
|
21
20
|
*
|
|
22
|
-
* @legacy
|
|
23
|
-
* @alpha
|
|
21
|
+
* @legacy @beta
|
|
24
22
|
*/
|
|
25
23
|
export interface ISharedArrayEvents extends ISharedObjectEvents {
|
|
26
24
|
/**
|
|
@@ -47,8 +45,7 @@ export interface ISharedArrayEvents extends ISharedObjectEvents {
|
|
|
47
45
|
*
|
|
48
46
|
* @typeParam T - The type of the SharedArray
|
|
49
47
|
*
|
|
50
|
-
* @legacy
|
|
51
|
-
* @alpha
|
|
48
|
+
* @legacy @beta
|
|
52
49
|
*/
|
|
53
50
|
export interface ISharedArray<T extends SerializableTypeForSharedArray> extends ISharedObject<ISharedArrayEvents> {
|
|
54
51
|
get(): readonly T[];
|
|
@@ -132,8 +129,7 @@ export interface SnapshotFormat<T> {
|
|
|
132
129
|
dataArray: T[];
|
|
133
130
|
}
|
|
134
131
|
/**
|
|
135
|
-
* @legacy
|
|
136
|
-
* @alpha
|
|
132
|
+
* @legacy @beta
|
|
137
133
|
*/
|
|
138
134
|
export interface IRevertible {
|
|
139
135
|
revert(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/array/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC3F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AACnF,OAAO,KAAK,EACX,mBAAmB,EACnB,aAAa,EACb,MAAM,6CAA6C,CAAC;AAErD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/array/interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/array/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IEventThisPlaceHolder, IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport type { Serializable } from \"@fluidframework/datastore-definitions/internal\";\nimport type {\n\tISharedObjectEvents,\n\tISharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\n\nimport type { ISharedArrayOperation } from \"./sharedArrayOperations.js\";\n/**\n * Basic types for the SharedArray DDS\n * It can be used as a generic constraint (`extends SerializableTypeForSharedArray`) but is\n * *never* meant to be a concrete/real type on its own.\n *\n * @legacy
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/array/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IEventThisPlaceHolder, IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport type { Serializable } from \"@fluidframework/datastore-definitions/internal\";\nimport type {\n\tISharedObjectEvents,\n\tISharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\n\nimport type { ISharedArrayOperation } from \"./sharedArrayOperations.js\";\n/**\n * Basic types for the SharedArray DDS\n * It can be used as a generic constraint (`extends SerializableTypeForSharedArray`) but is\n * *never* meant to be a concrete/real type on its own.\n *\n * @legacy @beta\n */\nexport type SerializableTypeForSharedArray = boolean | number | string | object | IFluidHandle;\n\n/**\n * Interface defining the events that can be emitted by the SharedArray DDS\n * and the events that can be listened to by the SharedArray DDS\n *\n * @legacy @beta\n */\nexport interface ISharedArrayEvents extends ISharedObjectEvents {\n\t/**\n\t *\n\t * @param event - The event name.\n\t * @param listener - An event listener.\n\t *\n\t * @eventProperty\n\t */\n\t(\n\t\tevent: \"valueChanged\",\n\t\tlistener: (\n\t\t\top: ISharedArrayOperation,\n\t\t\tisLocal: boolean,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t): void;\n\n\t/**\n\t *\n\t * @param event - The event name.\n\t * @param listener - An event listener.\n\t *\n\t * @eventProperty\n\t */\n\t(event: \"revertible\", listener: (revertible: IRevertible) => void): void;\n}\n\n/**\n * Interface defining the SharedArray DDS\n * It is a generic interface that can be used to create a SharedArray of any type\n * The type of the SharedArray is defined by the type parameter T\n *\n * @typeParam T - The type of the SharedArray\n *\n * @legacy @beta\n */\nexport interface ISharedArray<T extends SerializableTypeForSharedArray>\n\textends ISharedObject<ISharedArrayEvents> {\n\tget(): readonly T[];\n\tinsert<TWrite>(index: number, value: Serializable<TWrite> & T): void;\n\tdelete(index: number): void;\n\tmove(oldIndex: number, newIndex: number): void;\n\ttoggle(entryId: string): void;\n\ttoggleMove(oldEntryId: string, newEntryId: string): void;\n\tinsertBulkAfter<TWrite>(ref: T | undefined, values: (Serializable<TWrite> & T)[]): void;\n}\n\n/**\n *\n * @internal\n */\nexport interface ISharedArrayRevertible extends ISharedObject<ISharedArrayEvents> {\n\ttoggle(entryId: string): void;\n\ttoggleMove(oldEntryId: string, newEntryId: string): void;\n}\n\n/**\n * Interface defining the in memory shared array entry of the DDS\n *\n * @internal\n */\nexport interface SharedArrayEntry<T extends SerializableTypeForSharedArray>\n\textends SharedArrayEntryCore<T> {\n\t/**\n\t * Flag that tracks whether an ack from the server has been received for a local insert.\n\t * True for local changes.\n\t */\n\tisAckPending: boolean;\n\n\t/**\n\t * Counter is shared by delete and undo/redo (of delete and insert) as undo/redo simply\n\t * operates on the isDeleted flag of the DDS. This flag will help us skip local op acks as\n\t * they have already inflicted state change. The flag helps us ignore remote ops if there is a\n\t * local pending delete as we would be getting the pending op after server stamping\n\t */\n\tisLocalPendingDelete: number;\n\n\t/**\n\t * Counter is for move and its undo/redo. This flag will be used to skip local op acks as\n\t * they have already inflicted state change. The flag helps us ignore remote ops if there is a\n\t * local pending delete as we would be getting the pending op after server stamping. Only exception\n\t * being if there is a remote delete, we will have to respect that\n\t */\n\tisLocalPendingMove: number;\n}\n\n/**\n * Interface defining the core entry attributes\n *\n * @internal\n */\nexport interface SharedArrayEntryCore<T extends SerializableTypeForSharedArray> {\n\t/**\n\t * a unique ID for this particular entry\n\t */\n\tentryId: string;\n\n\t/**\n\t * the value stored in this entry, may not be unique\n\t */\n\tvalue: T;\n\n\t/**\n\t * Flag to track whether this entry is deleted or not.\n\t */\n\tisDeleted: boolean;\n\n\t/**\n\t * Primarily used for move op and tracks the old entry id from which this entry was changed from.\n\t */\n\tprevEntryId?: string;\n\n\t/**\n\t * Primarily used for move op and tracks the new entry id to which this entry was changed to.\n\t */\n\tnextEntryId?: string;\n}\n\n/**\n * Format of the snapshot for the DDS\n *\n * @internal\n */\nexport interface SnapshotFormat<T> {\n\t/**\n\t * Array of the data entries that represent the DDS in-memory representation\n\t */\n\tdataArray: T[];\n}\n\n/**\n * @legacy @beta\n */\nexport interface IRevertible {\n\trevert(): void;\n\tdispose(): void;\n}\n"]}
|
|
@@ -27,6 +27,12 @@ export declare class SharedArrayClass<T extends SerializableTypeForSharedArray>
|
|
|
27
27
|
* handling for this data structure
|
|
28
28
|
*/
|
|
29
29
|
private readonly idToEntryMap;
|
|
30
|
+
/**
|
|
31
|
+
* Set of entry IDs that are marked for deletion by remote clients, but have local pending deletes.
|
|
32
|
+
* Used to prevent resuscitating entries while rolling back a delete operation.
|
|
33
|
+
* We should not rollback to life an entry that was deleted by remote clients.
|
|
34
|
+
*/
|
|
35
|
+
private readonly remoteDeleteWithLocalPendingDelete;
|
|
30
36
|
/**
|
|
31
37
|
* Create a new shared array
|
|
32
38
|
*
|
|
@@ -87,6 +93,7 @@ export declare class SharedArrayClass<T extends SerializableTypeForSharedArray>
|
|
|
87
93
|
* @param newEntryId - EntryId of the to be live entry
|
|
88
94
|
*/
|
|
89
95
|
toggleMove(oldEntryId: string, newEntryId: string): void;
|
|
96
|
+
rollback(op: unknown, _localOpMetadata: unknown): void;
|
|
90
97
|
/**
|
|
91
98
|
* Load share array from snapshot
|
|
92
99
|
*
|
|
@@ -174,6 +181,7 @@ export declare class SharedArrayClass<T extends SerializableTypeForSharedArray>
|
|
|
174
181
|
* existingEntry -\> deadeEntry(appended) -\> existing chain(if any).
|
|
175
182
|
*/
|
|
176
183
|
private updateDeadEntry;
|
|
184
|
+
private handleStashedInsert;
|
|
177
185
|
protected applyStashedOp(content: unknown): void;
|
|
178
186
|
}
|
|
179
187
|
//# sourceMappingURL=sharedArray.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharedArray.d.ts","sourceRoot":"","sources":["../../src/array/sharedArray.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACX,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,sBAAsB,EACtB,MAAM,gDAAgD,CAAC;AACxD,OAAO,KAAK,EACX,yBAAyB,EAEzB,MAAM,6CAA6C,CAAC;AAErD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAE1F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,6CAA6C,CAAC;AAG3E,OAAO,KAAK,EACX,kBAAkB,EAClB,YAAY,EACZ,sBAAsB,EACtB,8BAA8B,EAI9B,MAAM,iBAAiB,CAAC;AAczB;;;;GAIG;AACH,qBAAa,gBAAgB,CAAC,CAAC,SAAS,8BAA8B,CACrE,SAAQ,YAAY,CAAC,kBAAkB,CACvC,YAAW,YAAY,CAAC,CAAC,CAAC,EAAE,sBAAsB;IAElD;;OAEG;IACH,OAAO,CAAC,WAAW,CAAwB;IAE3C;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmC;IAEhE;;;;;;OAMG;WACW,MAAM,CAAC,CAAC,SAAS,8BAA8B,EAC5D,OAAO,EAAE,sBAAsB,EAC/B,EAAE,CAAC,EAAE,MAAM,GACT,gBAAgB,CAAC,CAAC,CAAC;IAItB;;;;OAIG;WACW,UAAU,CAAC,CAAC,SAAS,8BAA8B,KAAK,eAAe;IAIrF;;;;;;;OAOG;gBAEF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;IAO/B;;;OAGG;IACI,GAAG,IAAI,SAAS,CAAC,EAAE;IAI1B,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB;IA0CrE,eAAe,CAAC,MAAM,EAC5B,GAAG,EAAE,CAAC,GAAG,SAAS,EAClB,MAAM,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAClC,IAAI;IAsBA,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI;IAO3E,OAAO,CAAC,UAAU;IAuBX,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IA2B3B,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI;IAwB1C;;;;;OAKG;IACI,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAuBrD,OAAO,CAAC,QAAQ;IAwBhB;;;;;;OAMG;IACI,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"sharedArray.d.ts","sourceRoot":"","sources":["../../src/array/sharedArray.ts"],"names":[],"mappings":"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"}
|
package/lib/array/sharedArray.js
CHANGED
|
@@ -45,6 +45,12 @@ export class SharedArrayClass extends SharedObject {
|
|
|
45
45
|
*/
|
|
46
46
|
constructor(id, runtime, attributes) {
|
|
47
47
|
super(id, runtime, attributes, "loop_sharedArray_" /* telemetryContextPrefix */);
|
|
48
|
+
/**
|
|
49
|
+
* Set of entry IDs that are marked for deletion by remote clients, but have local pending deletes.
|
|
50
|
+
* Used to prevent resuscitating entries while rolling back a delete operation.
|
|
51
|
+
* We should not rollback to life an entry that was deleted by remote clients.
|
|
52
|
+
*/
|
|
53
|
+
this.remoteDeleteWithLocalPendingDelete = new Set();
|
|
48
54
|
this.sharedArray = [];
|
|
49
55
|
this.idToEntryMap = new Map();
|
|
50
56
|
}
|
|
@@ -277,6 +283,68 @@ export class SharedArrayClass extends SharedObject {
|
|
|
277
283
|
}
|
|
278
284
|
this.submitLocalMessage(op);
|
|
279
285
|
}
|
|
286
|
+
rollback(op, _localOpMetadata) {
|
|
287
|
+
const arrayOp = op;
|
|
288
|
+
switch (arrayOp.type) {
|
|
289
|
+
case OperationType.insertEntry: {
|
|
290
|
+
const liveEntry = this.getLiveEntry(arrayOp.entryId);
|
|
291
|
+
liveEntry.isDeleted = true;
|
|
292
|
+
const deleteOp = {
|
|
293
|
+
type: OperationType.deleteEntry,
|
|
294
|
+
entryId: arrayOp.entryId,
|
|
295
|
+
};
|
|
296
|
+
this.emitValueChangedEvent(deleteOp, true /* isLocal */);
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
case OperationType.deleteEntry: {
|
|
300
|
+
if (this.remoteDeleteWithLocalPendingDelete.has(arrayOp.entryId)) {
|
|
301
|
+
// If remote already deleted the entry, we should not resurrect it.
|
|
302
|
+
// Just remove the local pending delete.
|
|
303
|
+
this.remoteDeleteWithLocalPendingDelete.delete(arrayOp.entryId);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
const liveEntry = this.getLiveEntry(arrayOp.entryId);
|
|
307
|
+
liveEntry.isDeleted = false;
|
|
308
|
+
const insertOp = {
|
|
309
|
+
type: OperationType.insertEntry,
|
|
310
|
+
entryId: arrayOp.entryId,
|
|
311
|
+
value: liveEntry.value,
|
|
312
|
+
};
|
|
313
|
+
this.emitValueChangedEvent(insertOp, true /* isLocal */);
|
|
314
|
+
const entry = this.getEntryForId(arrayOp.entryId);
|
|
315
|
+
if (entry !== undefined && entry.isLocalPendingDelete > 0) {
|
|
316
|
+
entry.isLocalPendingDelete -= 1;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
case OperationType.moveEntry: {
|
|
322
|
+
const { entryId: oldEntryId, changedToEntryId: newEntryId } = arrayOp;
|
|
323
|
+
if (this.getEntryForId(newEntryId).isDeleted) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
this.updateLiveEntry(newEntryId, oldEntryId);
|
|
327
|
+
const inputEntry = this.getEntryForId(oldEntryId);
|
|
328
|
+
inputEntry.prevEntryId = undefined;
|
|
329
|
+
inputEntry.nextEntryId = undefined;
|
|
330
|
+
inputEntry.isLocalPendingMove = 0;
|
|
331
|
+
const moveOp = {
|
|
332
|
+
type: OperationType.moveEntry,
|
|
333
|
+
entryId: newEntryId,
|
|
334
|
+
changedToEntryId: oldEntryId,
|
|
335
|
+
};
|
|
336
|
+
this.emitValueChangedEvent(moveOp, true /* isLocal */);
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
case OperationType.toggle:
|
|
340
|
+
case OperationType.toggleMove: {
|
|
341
|
+
throw new Error(`Rollback not implemented for ${arrayOp.type} operations`);
|
|
342
|
+
}
|
|
343
|
+
default: {
|
|
344
|
+
unreachableCase(arrayOp);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
280
348
|
/**
|
|
281
349
|
* Load share array from snapshot
|
|
282
350
|
*
|
|
@@ -401,10 +469,13 @@ export class SharedArrayClass extends SharedObject {
|
|
|
401
469
|
if (local) {
|
|
402
470
|
// Decrementing local pending counter as op is already applied to local state
|
|
403
471
|
opEntry.isLocalPendingDelete -= 1;
|
|
472
|
+
this.remoteDeleteWithLocalPendingDelete.delete(op.entryId);
|
|
404
473
|
}
|
|
405
474
|
else {
|
|
406
|
-
|
|
407
|
-
|
|
475
|
+
if (this.isLocalPending(op.entryId, "isLocalPendingDelete")) {
|
|
476
|
+
this.remoteDeleteWithLocalPendingDelete.add(op.entryId);
|
|
477
|
+
}
|
|
478
|
+
else {
|
|
408
479
|
// last element in skip list is the most recent and live entry, so marking it deleted
|
|
409
480
|
this.getLiveEntry(op.entryId).isDeleted = true;
|
|
410
481
|
}
|
|
@@ -656,28 +727,57 @@ export class SharedArrayClass extends SharedObject {
|
|
|
656
727
|
deadEntry.prevEntryId = existingEntryId;
|
|
657
728
|
deadEntry.isDeleted = true;
|
|
658
729
|
}
|
|
730
|
+
handleStashedInsert(entryId, insertAfterEntryId, value) {
|
|
731
|
+
let index = 0;
|
|
732
|
+
if (insertAfterEntryId !== undefined) {
|
|
733
|
+
index = this.findIndexOfEntryId(insertAfterEntryId) + 1;
|
|
734
|
+
}
|
|
735
|
+
const newEntry = this.createNewEntry(entryId, value);
|
|
736
|
+
newEntry.isAckPending = true;
|
|
737
|
+
this.addEntry(index, newEntry);
|
|
738
|
+
}
|
|
659
739
|
applyStashedOp(content) {
|
|
660
740
|
const op = content;
|
|
661
741
|
switch (op.type) {
|
|
662
742
|
case OperationType.insertEntry: {
|
|
663
|
-
this.
|
|
664
|
-
op.value);
|
|
743
|
+
this.handleStashedInsert(op.entryId, op.insertAfterEntryId, op.value);
|
|
665
744
|
break;
|
|
666
745
|
}
|
|
667
746
|
case OperationType.deleteEntry: {
|
|
668
|
-
this.
|
|
747
|
+
this.getLiveEntry(op.entryId).isDeleted = true;
|
|
748
|
+
this.getEntryForId(op.entryId).isLocalPendingDelete += 1;
|
|
669
749
|
break;
|
|
670
750
|
}
|
|
671
751
|
case OperationType.moveEntry: {
|
|
672
|
-
this.
|
|
752
|
+
const opEntry = this.getEntryForId(op.entryId);
|
|
753
|
+
this.handleStashedInsert(op.changedToEntryId, op.insertAfterEntryId, opEntry.value);
|
|
754
|
+
const newElementEntryId = op.changedToEntryId;
|
|
755
|
+
const newElement = this.getEntryForId(newElementEntryId);
|
|
756
|
+
if (this.isLocalPending(op.entryId, "isLocalPendingDelete") ||
|
|
757
|
+
this.isLocalPending(op.entryId, "isLocalPendingMove")) {
|
|
758
|
+
this.updateDeadEntry(op.entryId, newElementEntryId);
|
|
759
|
+
}
|
|
760
|
+
else {
|
|
761
|
+
// move the element
|
|
762
|
+
const liveEntry = this.getLiveEntry(op.entryId);
|
|
763
|
+
const isDeleted = liveEntry.isDeleted;
|
|
764
|
+
this.updateLiveEntry(liveEntry.entryId, newElementEntryId);
|
|
765
|
+
// mark newly added element as deleted if existing live element was already deleted
|
|
766
|
+
if (isDeleted) {
|
|
767
|
+
newElement.isDeleted = isDeleted;
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
newElement.isLocalPendingMove += 1;
|
|
673
771
|
break;
|
|
674
772
|
}
|
|
675
773
|
case OperationType.toggle: {
|
|
676
|
-
this.
|
|
774
|
+
this.getLiveEntry(op.entryId).isDeleted = op.isDeleted;
|
|
775
|
+
this.getEntryForId(op.entryId).isLocalPendingDelete += 1;
|
|
677
776
|
break;
|
|
678
777
|
}
|
|
679
778
|
case OperationType.toggleMove: {
|
|
680
|
-
this.
|
|
779
|
+
this.updateLiveEntry(this.getLiveEntry(op.entryId).entryId, op.entryId);
|
|
780
|
+
this.getEntryForId(op.entryId).isLocalPendingMove += 1;
|
|
681
781
|
break;
|
|
682
782
|
}
|
|
683
783
|
default: {
|