@fluidframework/shared-object-base 2.33.2 → 2.40.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.
Files changed (71) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/api-report/shared-object-base.legacy.alpha.api.md +7 -5
  3. package/dist/gcHandleVisitor.d.ts +1 -1
  4. package/dist/gcHandleVisitor.d.ts.map +1 -1
  5. package/dist/gcHandleVisitor.js +1 -1
  6. package/dist/gcHandleVisitor.js.map +1 -1
  7. package/dist/handle.d.ts +21 -1
  8. package/dist/handle.d.ts.map +1 -1
  9. package/dist/handle.js +10 -1
  10. package/dist/handle.js.map +1 -1
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +7 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/packageVersion.d.ts +1 -1
  16. package/dist/packageVersion.js +1 -1
  17. package/dist/packageVersion.js.map +1 -1
  18. package/dist/serializer.d.ts +3 -2
  19. package/dist/serializer.d.ts.map +1 -1
  20. package/dist/serializer.js +4 -2
  21. package/dist/serializer.js.map +1 -1
  22. package/dist/sharedObject.d.ts +57 -11
  23. package/dist/sharedObject.d.ts.map +1 -1
  24. package/dist/sharedObject.js +72 -16
  25. package/dist/sharedObject.js.map +1 -1
  26. package/dist/sharedObjectKernel.d.ts +186 -0
  27. package/dist/sharedObjectKernel.d.ts.map +1 -0
  28. package/dist/sharedObjectKernel.js +227 -0
  29. package/dist/sharedObjectKernel.js.map +1 -0
  30. package/dist/types.d.ts +13 -1
  31. package/dist/types.d.ts.map +1 -1
  32. package/dist/types.js.map +1 -1
  33. package/lib/gcHandleVisitor.d.ts +1 -1
  34. package/lib/gcHandleVisitor.d.ts.map +1 -1
  35. package/lib/gcHandleVisitor.js +1 -1
  36. package/lib/gcHandleVisitor.js.map +1 -1
  37. package/lib/handle.d.ts +21 -1
  38. package/lib/handle.d.ts.map +1 -1
  39. package/lib/handle.js +8 -0
  40. package/lib/handle.js.map +1 -1
  41. package/lib/index.d.ts +2 -0
  42. package/lib/index.d.ts.map +1 -1
  43. package/lib/index.js +2 -0
  44. package/lib/index.js.map +1 -1
  45. package/lib/packageVersion.d.ts +1 -1
  46. package/lib/packageVersion.js +1 -1
  47. package/lib/packageVersion.js.map +1 -1
  48. package/lib/serializer.d.ts +3 -2
  49. package/lib/serializer.d.ts.map +1 -1
  50. package/lib/serializer.js +4 -2
  51. package/lib/serializer.js.map +1 -1
  52. package/lib/sharedObject.d.ts +57 -11
  53. package/lib/sharedObject.d.ts.map +1 -1
  54. package/lib/sharedObject.js +73 -17
  55. package/lib/sharedObject.js.map +1 -1
  56. package/lib/sharedObjectKernel.d.ts +186 -0
  57. package/lib/sharedObjectKernel.d.ts.map +1 -0
  58. package/lib/sharedObjectKernel.js +222 -0
  59. package/lib/sharedObjectKernel.js.map +1 -0
  60. package/lib/types.d.ts +13 -1
  61. package/lib/types.d.ts.map +1 -1
  62. package/lib/types.js.map +1 -1
  63. package/package.json +15 -14
  64. package/src/gcHandleVisitor.ts +1 -4
  65. package/src/handle.ts +29 -1
  66. package/src/index.ts +11 -0
  67. package/src/packageVersion.ts +1 -1
  68. package/src/serializer.ts +7 -4
  69. package/src/sharedObject.ts +74 -18
  70. package/src/sharedObjectKernel.ts +467 -0
  71. package/src/types.ts +13 -1
@@ -0,0 +1,227 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
7
+ if (kind === "m") throw new TypeError("Private method is not writable");
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
10
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
11
+ };
12
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
13
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
14
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
15
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
16
+ };
17
+ var _SharedObjectFromKernel_instances, _SharedObjectFromKernel_lazyData, _SharedObjectFromKernel_kernelArgs, _SharedObjectFromKernel_initializeData, _SharedObjectFromKernel_kernel_get;
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.makeSharedObjectKind = exports.mergeAPIs = exports.thisWrap = void 0;
20
+ const internal_1 = require("@fluidframework/core-utils/internal");
21
+ const sharedObject_js_1 = require("./sharedObject.js");
22
+ /**
23
+ * SharedObject implementation that delegates to a SharedKernel.
24
+ * @typeParam TOut - The type of the object exposed to the app.
25
+ * Once initialized, instances of this class forward properties to the `TOut` value provided by the factory.
26
+ * See {@link mergeAPIs} for more limitations.
27
+ *
28
+ * @remarks
29
+ * The App facing API (TOut) needs to be implemented by this object which also has to implement the runtime facing API (ISharedObject).
30
+ *
31
+ * Requiring both of these to be implemented by the same object adds some otherwise unnecessary coupling.
32
+ * This class is a workaround for that, which takes separate implementations of the two APIs and merges them into one using {@link mergeAPIs}.
33
+ */
34
+ class SharedObjectFromKernel extends sharedObject_js_1.SharedObject {
35
+ constructor(id, runtime, attributes, factory, telemetryContextPrefix) {
36
+ super(id, runtime, attributes, telemetryContextPrefix);
37
+ _SharedObjectFromKernel_instances.add(this);
38
+ this.factory = factory;
39
+ /**
40
+ * Lazy init here so kernel can be constructed in loadCore when loading from existing data.
41
+ *
42
+ * Explicit initialization to undefined is done so Proxy knows this property is from this class (via `Reflect.has`),
43
+ * not from the grafted APIs.
44
+ */
45
+ _SharedObjectFromKernel_lazyData.set(this, undefined);
46
+ _SharedObjectFromKernel_kernelArgs.set(this, void 0);
47
+ __classPrivateFieldSet(this, _SharedObjectFromKernel_kernelArgs, {
48
+ sharedObject: this,
49
+ serializer: this.serializer,
50
+ submitLocalMessage: (op, localOpMetadata) => this.submitLocalMessage(op, localOpMetadata),
51
+ eventEmitter: this,
52
+ logger: this.logger,
53
+ idCompressor: runtime.idCompressor,
54
+ lastSequenceNumber: () => this.deltaManager.lastSequenceNumber,
55
+ }, "f");
56
+ }
57
+ summarizeCore(serializer, telemetryContext, incrementalSummaryContext) {
58
+ return __classPrivateFieldGet(this, _SharedObjectFromKernel_instances, "a", _SharedObjectFromKernel_kernel_get).summarizeCore(serializer, telemetryContext, incrementalSummaryContext);
59
+ }
60
+ initializeLocalCore() {
61
+ __classPrivateFieldGet(this, _SharedObjectFromKernel_instances, "m", _SharedObjectFromKernel_initializeData).call(this, this.factory.create(__classPrivateFieldGet(this, _SharedObjectFromKernel_kernelArgs, "f")));
62
+ }
63
+ async loadCore(storage) {
64
+ __classPrivateFieldGet(this, _SharedObjectFromKernel_instances, "m", _SharedObjectFromKernel_initializeData).call(this, await this.factory.loadCore(__classPrivateFieldGet(this, _SharedObjectFromKernel_kernelArgs, "f"), storage));
65
+ }
66
+ onDisconnect() {
67
+ __classPrivateFieldGet(this, _SharedObjectFromKernel_instances, "a", _SharedObjectFromKernel_kernel_get).onDisconnect();
68
+ }
69
+ reSubmitCore(content, localOpMetadata) {
70
+ __classPrivateFieldGet(this, _SharedObjectFromKernel_instances, "a", _SharedObjectFromKernel_kernel_get).reSubmitCore(content, localOpMetadata);
71
+ }
72
+ applyStashedOp(content) {
73
+ __classPrivateFieldGet(this, _SharedObjectFromKernel_instances, "a", _SharedObjectFromKernel_kernel_get).applyStashedOp(content);
74
+ }
75
+ processCore() {
76
+ (0, internal_1.fail)("processCore should not be called");
77
+ }
78
+ processMessagesCore(messagesCollection) {
79
+ __classPrivateFieldGet(this, _SharedObjectFromKernel_instances, "a", _SharedObjectFromKernel_kernel_get).processMessagesCore(messagesCollection);
80
+ }
81
+ rollback(content, localOpMetadata) {
82
+ if (__classPrivateFieldGet(this, _SharedObjectFromKernel_instances, "a", _SharedObjectFromKernel_kernel_get).rollback === undefined) {
83
+ super.rollback(content, localOpMetadata);
84
+ }
85
+ else {
86
+ __classPrivateFieldGet(this, _SharedObjectFromKernel_instances, "a", _SharedObjectFromKernel_kernel_get).rollback(content, localOpMetadata);
87
+ }
88
+ }
89
+ didAttach() {
90
+ __classPrivateFieldGet(this, _SharedObjectFromKernel_instances, "a", _SharedObjectFromKernel_kernel_get).didAttach?.();
91
+ }
92
+ }
93
+ _SharedObjectFromKernel_lazyData = new WeakMap(), _SharedObjectFromKernel_kernelArgs = new WeakMap(), _SharedObjectFromKernel_instances = new WeakSet(), _SharedObjectFromKernel_initializeData = function _SharedObjectFromKernel_initializeData(data) {
94
+ (0, internal_1.assert)(__classPrivateFieldGet(this, _SharedObjectFromKernel_lazyData, "f") === undefined, "initializeData must be called first and only once");
95
+ __classPrivateFieldSet(this, _SharedObjectFromKernel_lazyData, data, "f");
96
+ // Make `this` implement TOut.
97
+ mergeAPIs(this, data.view);
98
+ }, _SharedObjectFromKernel_kernel_get = function _SharedObjectFromKernel_kernel_get() {
99
+ return (__classPrivateFieldGet(this, _SharedObjectFromKernel_lazyData, "f") ?? (0, internal_1.fail)("must initializeData first")).kernel;
100
+ };
101
+ /**
102
+ * When present on a method, it indicates the methods return value should be replaced with `this` (the wrapper)
103
+ * when wrapping the object with the method.
104
+ * @remarks
105
+ * This is useful when using {@link mergeAPIs} with methods where the return type is `this`, like `Map.set`.
106
+ * @internal
107
+ */
108
+ exports.thisWrap = Symbol("selfWrap");
109
+ /**
110
+ * Add getters to `base` which forward own properties from `extra`.
111
+ * @remarks
112
+ * This only handles use of "get" and "has".
113
+ * Therefore, APIs involving setting properties should not be used as `Extra`.
114
+ *
115
+ * Functions from `extra` are bound to the `extra` object and support {@link thisWrap}.
116
+ *
117
+ * Asserts when properties collide.
118
+ * @internal
119
+ */
120
+ function mergeAPIs(base, extra) {
121
+ for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(extra))) {
122
+ (0, internal_1.assert)(!Reflect.has(base, key), "colliding properties");
123
+ // Detect and special case functions.
124
+ // Currently this is done eagerly (when mergeAPIs is called) rather than lazily (when the property is read):
125
+ // this eager approach should result in slightly better performance,
126
+ // but if functions on `extra` are reassigned over time it will produce incorrect behavior.
127
+ // If this functionality is required, the design can be changed.
128
+ let getter;
129
+ // Bind functions to the extra object and handle thisWrap.
130
+ if (typeof descriptor.value === "function") {
131
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
132
+ const fromExtra = descriptor.value;
133
+ getter = () => forwardMethod(fromExtra, extra, base);
134
+ // To catch (and error on) cases where the function is reassigned and this eager binding approach is not appropriate, make it non-writable.
135
+ Object.defineProperty(extra, key, { ...descriptor, writable: false });
136
+ }
137
+ else {
138
+ getter = () => extra[key];
139
+ }
140
+ Object.defineProperty(base, key, {
141
+ configurable: false,
142
+ enumerable: descriptor.enumerable,
143
+ get: getter,
144
+ // If setters become required, support them here.
145
+ });
146
+ }
147
+ }
148
+ exports.mergeAPIs = mergeAPIs;
149
+ /**
150
+ * Wrap a method `f` of `oldThis` to be a method of `newThis`.
151
+ * @remarks
152
+ * The wrapped function will be called with `oldThis` as the `this` parameter.
153
+ * It also accounts for when `f` is marked with {@link thisWrap}.
154
+ */
155
+ function forwardMethod(f, oldThis, newThis) {
156
+ // eslint-disable-next-line unicorn/prefer-ternary
157
+ if (exports.thisWrap in f) {
158
+ return (...args) => {
159
+ const result = f.call(oldThis, ...args);
160
+ (0, internal_1.assert)(result === oldThis, "methods returning thisWrap should return this");
161
+ return newThis;
162
+ };
163
+ }
164
+ else {
165
+ return f.bind(oldThis);
166
+ }
167
+ }
168
+ /**
169
+ * Utility to create a {@link @fluidframework/datastore-definitions#IChannelFactory} classes.
170
+ * @remarks
171
+ * Use {@link makeSharedObjectKind} instead unless exposing the factory is required for legacy API compatibility.
172
+ * @internal
173
+ */
174
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
175
+ function makeChannelFactory(options) {
176
+ class ChannelFactory {
177
+ /**
178
+ * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory."type"}
179
+ */
180
+ get type() {
181
+ return ChannelFactory.Type;
182
+ }
183
+ /**
184
+ * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.attributes}
185
+ */
186
+ get attributes() {
187
+ return ChannelFactory.Attributes;
188
+ }
189
+ /**
190
+ * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}
191
+ */
192
+ async load(runtime, id, services, attributes) {
193
+ const shared = new SharedObjectFromKernel(id, runtime, attributes, options.factory, options.telemetryContextPrefix);
194
+ await shared.load(services);
195
+ return shared;
196
+ }
197
+ /**
198
+ * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.create}
199
+ */
200
+ create(runtime, id) {
201
+ const shared = new SharedObjectFromKernel(id, runtime, ChannelFactory.Attributes, options.factory, options.telemetryContextPrefix);
202
+ shared.initializeLocal();
203
+ return shared;
204
+ }
205
+ }
206
+ /**
207
+ * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory."type"}
208
+ */
209
+ ChannelFactory.Type = options.type;
210
+ /**
211
+ * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.attributes}
212
+ */
213
+ ChannelFactory.Attributes = options.attributes;
214
+ return ChannelFactory;
215
+ }
216
+ /**
217
+ * Utility to create a {@link SharedObjectKind}.
218
+ * @privateRemarks
219
+ * Using this API avoids having to subclasses any Fluid Framework types,
220
+ * reducing the coupling between the framework and the SharedObject implementation.
221
+ * @internal
222
+ */
223
+ function makeSharedObjectKind(options) {
224
+ return (0, sharedObject_js_1.createSharedObjectKind)(makeChannelFactory(options));
225
+ }
226
+ exports.makeSharedObjectKind = makeSharedObjectKind;
227
+ //# sourceMappingURL=sharedObjectKernel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedObjectKernel.js","sourceRoot":"","sources":["../src/sharedObjectKernel.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 type { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport type { IFluidLoadable } from \"@fluidframework/core-interfaces\";\nimport { assert, fail } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIChannelStorageService,\n\ttype IChannel,\n\ttype IChannelAttributes,\n\ttype IChannelFactory,\n\ttype IChannelServices,\n\ttype IFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor/internal\";\nimport {\n\tISummaryTreeWithStats,\n\tITelemetryContext,\n\ttype IExperimentalIncrementalSummaryContext,\n\ttype IRuntimeMessageCollection,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport type { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { IFluidSerializer } from \"./serializer.js\";\nimport {\n\tcreateSharedObjectKind,\n\tSharedObject,\n\ttype ISharedObjectKind,\n\ttype SharedObjectKind,\n} from \"./sharedObject.js\";\nimport { ISharedObjectEvents, type ISharedObject } from \"./types.js\";\nimport type { IChannelView } from \"./utils.js\";\n\n/**\n * Functionality specific to a particular kind of {@link ISharedObject}.\n * @remarks\n * Shared objects expose APIs for two consumers:\n *\n * 1. The runtime, which uses {@link @fluidframework/datastore-definitions#IChannel} to summarize and apply ops and {@link @fluidframework/datastore-definitions#IChannelFactory} to create the load summaries.\n *\n * 2. The app, which uses shared object kind specific APIs to read and write data.\n *\n * There is some common functionality all shared objects use, provided by {@link SharedObject} and {@link SharedObjectCore}.\n * SharedKernel describes the portion of the behavior required by the runtime which\n * differs between different kinds of shared objects.\n *\n * {@link makeSharedObjectKind} is then used to wrap up the kernel into a full {@link ISharedObject} implementation.\n * The runtime specific APIs are then type erased into a {@link SharedObjectKind}.\n * @privateRemarks\n * Unlike the `SharedObject` class, this interface is internal, and thus can be adjusted more easily.\n * Therefore this interface is not intended to address all needs, and will likely need small changes as it gets more adoption.\n *\n * @internal\n */\nexport interface SharedKernel {\n\t/**\n\t * {@inheritDoc SharedObject.summarizeCore}\n\t */\n\tsummarizeCore(\n\t\tserializer: IFluidSerializer,\n\t\ttelemetryContext: ITelemetryContext | undefined,\n\t\tincrementalSummaryContext: IExperimentalIncrementalSummaryContext | undefined,\n\t): ISummaryTreeWithStats;\n\n\t/**\n\t * {@inheritDoc SharedObjectCore.onDisconnect}\n\t */\n\tonDisconnect(): void;\n\n\t/**\n\t * {@inheritDoc SharedObjectCore.reSubmitCore}\n\t */\n\treSubmitCore(content: unknown, localOpMetadata: unknown): void;\n\n\t/**\n\t * {@inheritDoc SharedObjectCore.applyStashedOp}\n\t */\n\tapplyStashedOp(content: unknown): void;\n\n\t/**\n\t * {@inheritDoc SharedObjectCore.processMessagesCore}\n\t */\n\tprocessMessagesCore(messagesCollection: IRuntimeMessageCollection): void;\n\n\t/**\n\t * {@inheritDoc SharedObjectCore.rollback}\n\t */\n\trollback?(content: unknown, localOpMetadata: unknown): void;\n\n\t/**\n\t * {@inheritDoc SharedObjectCore.didAttach}\n\t */\n\tdidAttach?(): void;\n}\n\n/**\n * SharedObject implementation that delegates to a SharedKernel.\n * @typeParam TOut - The type of the object exposed to the app.\n * Once initialized, instances of this class forward properties to the `TOut` value provided by the factory.\n * See {@link mergeAPIs} for more limitations.\n *\n * @remarks\n * The App facing API (TOut) needs to be implemented by this object which also has to implement the runtime facing API (ISharedObject).\n *\n * Requiring both of these to be implemented by the same object adds some otherwise unnecessary coupling.\n * This class is a workaround for that, which takes separate implementations of the two APIs and merges them into one using {@link mergeAPIs}.\n */\nclass SharedObjectFromKernel<\n\tTOut extends object,\n\tTEvent extends ISharedObjectEvents,\n> extends SharedObject<TEvent> {\n\t/**\n\t * Lazy init here so kernel can be constructed in loadCore when loading from existing data.\n\t *\n\t * Explicit initialization to undefined is done so Proxy knows this property is from this class (via `Reflect.has`),\n\t * not from the grafted APIs.\n\t */\n\t#lazyData: FactoryOut<TOut> | undefined = undefined;\n\n\treadonly #kernelArgs: KernelArgs;\n\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\tpublic readonly factory: SharedKernelFactory<TOut>,\n\t\ttelemetryContextPrefix: string,\n\t) {\n\t\tsuper(id, runtime, attributes, telemetryContextPrefix);\n\n\t\tthis.#kernelArgs = {\n\t\t\tsharedObject: this,\n\t\t\tserializer: this.serializer,\n\t\t\tsubmitLocalMessage: (op, localOpMetadata) =>\n\t\t\t\tthis.submitLocalMessage(op, localOpMetadata),\n\t\t\teventEmitter: this,\n\t\t\tlogger: this.logger,\n\t\t\tidCompressor: runtime.idCompressor,\n\t\t\tlastSequenceNumber: () => this.deltaManager.lastSequenceNumber,\n\t\t};\n\t}\n\n\tprotected override summarizeCore(\n\t\tserializer: IFluidSerializer,\n\t\ttelemetryContext?: ITelemetryContext,\n\t\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext,\n\t): ISummaryTreeWithStats {\n\t\treturn this.#kernel.summarizeCore(serializer, telemetryContext, incrementalSummaryContext);\n\t}\n\n\tprotected override initializeLocalCore(): void {\n\t\tthis.#initializeData(this.factory.create(this.#kernelArgs));\n\t}\n\n\t#initializeData(data: FactoryOut<TOut>): void {\n\t\tassert(this.#lazyData === undefined, \"initializeData must be called first and only once\");\n\t\tthis.#lazyData = data;\n\n\t\t// Make `this` implement TOut.\n\t\tmergeAPIs(this, data.view);\n\t}\n\n\tget #kernel(): SharedKernel {\n\t\treturn (this.#lazyData ?? fail(\"must initializeData first\")).kernel;\n\t}\n\n\tprotected override async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tthis.#initializeData(await this.factory.loadCore(this.#kernelArgs, storage));\n\t}\n\n\tprotected override onDisconnect(): void {\n\t\tthis.#kernel.onDisconnect();\n\t}\n\n\tprotected override reSubmitCore(content: unknown, localOpMetadata: unknown): void {\n\t\tthis.#kernel.reSubmitCore(content, localOpMetadata);\n\t}\n\n\tprotected override applyStashedOp(content: unknown): void {\n\t\tthis.#kernel.applyStashedOp(content);\n\t}\n\n\tprotected override processCore(): void {\n\t\tfail(\"processCore should not be called\");\n\t}\n\n\tprotected override processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {\n\t\tthis.#kernel.processMessagesCore(messagesCollection);\n\t}\n\n\tprotected override rollback(content: unknown, localOpMetadata: unknown): void {\n\t\tif (this.#kernel.rollback === undefined) {\n\t\t\tsuper.rollback(content, localOpMetadata);\n\t\t} else {\n\t\t\tthis.#kernel.rollback(content, localOpMetadata);\n\t\t}\n\t}\n\n\tprotected override didAttach(): void {\n\t\tthis.#kernel.didAttach?.();\n\t}\n}\n\n/**\n * When present on a method, it indicates the methods return value should be replaced with `this` (the wrapper)\n * when wrapping the object with the method.\n * @remarks\n * This is useful when using {@link mergeAPIs} with methods where the return type is `this`, like `Map.set`.\n * @internal\n */\nexport const thisWrap: unique symbol = Symbol(\"selfWrap\");\n\n/**\n * A {@link SharedKernel} providing the implementation of some distributed data structure (DDS) and the needed runtime facing APIs,\n * and a separate view object which exposes the app facing APIs (`T`)\n * for reading and writing data which are specific to this particular data structure.\n * @remarks\n * Output from {@link SharedKernelFactory}.\n * This is an alternative to defining DDSs by sub-classing {@link SharedObject}.\n * @internal\n */\nexport interface FactoryOut<T extends object> {\n\treadonly kernel: SharedKernel;\n\treadonly view: T;\n}\n\n/**\n * A factory for creating DDSs.\n * @remarks\n * Outputs {@link FactoryOut}.\n * This is an alternative to directly implementing {@link @fluidframework/datastore-definitions#IChannelFactory}.\n * Use with {@link makeSharedObjectKind} to create a {@link SharedObjectKind}.\n * @internal\n */\nexport interface SharedKernelFactory<T extends object> {\n\tcreate(args: KernelArgs): FactoryOut<T>;\n\n\t/**\n\t * Create combined with {@link SharedObjectCore.loadCore}.\n\t */\n\tloadCore(args: KernelArgs, storage: IChannelStorageService): Promise<FactoryOut<T>>;\n}\n\n/**\n * Inputs for building a {@link SharedKernel} via {@link SharedKernelFactory}.\n * @internal\n */\nexport interface KernelArgs {\n\t/**\n\t * The shared object whose behavior is being implemented.\n\t */\n\treadonly sharedObject: IChannelView & IFluidLoadable;\n\t/**\n\t * {@inheritdoc SharedObject.serializer}\n\t */\n\treadonly serializer: IFluidSerializer;\n\t/**\n\t * {@inheritdoc SharedObjectCore.submitLocalMessage}\n\t */\n\treadonly submitLocalMessage: (op: unknown, localOpMetadata: unknown) => void;\n\t/**\n\t * Top level emitter for events for this object.\n\t * @remarks\n\t * This is needed since the separate kernel and view from {@link FactoryOut} currently have to be recombined,\n\t * and having this as its own thing helps accomplish that.\n\t */\n\treadonly eventEmitter: TypedEventEmitter<ISharedObjectEvents>;\n\t/**\n\t * {@inheritdoc SharedObjectCore.logger}\n\t */\n\treadonly logger: ITelemetryLoggerExt;\n\t/**\n\t * {@inheritdoc @fluidframework/datastore-definitions#IFluidDataStoreRuntime.idCompressor}\n\t */\n\treadonly idCompressor: IIdCompressor | undefined;\n\t/**\n\t * {@inheritdoc @fluidframework/container-definitions#IDeltaManager.lastSequenceNumber}\n\t */\n\treadonly lastSequenceNumber: () => number;\n}\n\n/**\n * Add getters to `base` which forward own properties from `extra`.\n * @remarks\n * This only handles use of \"get\" and \"has\".\n * Therefore, APIs involving setting properties should not be used as `Extra`.\n *\n * Functions from `extra` are bound to the `extra` object and support {@link thisWrap}.\n *\n * Asserts when properties collide.\n * @internal\n */\nexport function mergeAPIs<const Base extends object, const Extra extends object>(\n\tbase: Base,\n\textra: Extra,\n): asserts base is Base & Extra {\n\tfor (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(extra))) {\n\t\tassert(!Reflect.has(base, key), \"colliding properties\");\n\n\t\t// Detect and special case functions.\n\t\t// Currently this is done eagerly (when mergeAPIs is called) rather than lazily (when the property is read):\n\t\t// this eager approach should result in slightly better performance,\n\t\t// but if functions on `extra` are reassigned over time it will produce incorrect behavior.\n\t\t// If this functionality is required, the design can be changed.\n\t\tlet getter: () => unknown;\n\t\t// Bind functions to the extra object and handle thisWrap.\n\t\tif (typeof descriptor.value === \"function\") {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\tconst fromExtra: () => Extra | Base = descriptor.value;\n\t\t\tgetter = () => forwardMethod(fromExtra, extra, base);\n\t\t\t// To catch (and error on) cases where the function is reassigned and this eager binding approach is not appropriate, make it non-writable.\n\t\t\tObject.defineProperty(extra, key, { ...descriptor, writable: false });\n\t\t} else {\n\t\t\tgetter = () => extra[key];\n\t\t}\n\n\t\tObject.defineProperty(base, key, {\n\t\t\tconfigurable: false,\n\t\t\tenumerable: descriptor.enumerable,\n\t\t\tget: getter,\n\t\t\t// If setters become required, support them here.\n\t\t});\n\t}\n}\n\n/**\n * Wrap a method `f` of `oldThis` to be a method of `newThis`.\n * @remarks\n * The wrapped function will be called with `oldThis` as the `this` parameter.\n * It also accounts for when `f` is marked with {@link thisWrap}.\n */\nfunction forwardMethod<TArgs extends [], TReturn>(\n\tf: (...args: TArgs) => TReturn,\n\toldThis: TReturn,\n\tnewThis: TReturn,\n): (...args: TArgs) => TReturn {\n\t// eslint-disable-next-line unicorn/prefer-ternary\n\tif (thisWrap in f) {\n\t\treturn (...args: TArgs) => {\n\t\t\tconst result = f.call(oldThis, ...args);\n\t\t\tassert(result === oldThis, \"methods returning thisWrap should return this\");\n\t\t\treturn newThis;\n\t\t};\n\t} else {\n\t\treturn f.bind(oldThis);\n\t}\n}\n\n/**\n * Options for creating a {@link SharedObjectKind} via {@link makeSharedObjectKind}.\n * @typeParam T - The type of the object exposed to the app.\n * This can optionally include members from {@link ISharedObject} which will be provided automatically.\n * @internal\n */\nexport interface SharedObjectOptions<T extends object> {\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.\"type\"}\n\t */\n\treadonly type: string;\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.attributes}\n\t */\n\treadonly attributes: IChannelAttributes;\n\n\t/**\n\t * The factory used to create the kernel and its view.\n\t * @remarks\n\t * The view produced by this factory will be grafted onto the {@link SharedObject} using {@link mergeAPIs}.\n\t * See {@link mergeAPIs} for more information on limitations that apply.\n\t */\n\treadonly factory: SharedKernelFactory<Omit<T, keyof ISharedObject>>;\n\n\t/**\n\t * {@inheritDoc SharedObject.telemetryContextPrefix}\n\t */\n\treadonly telemetryContextPrefix: string;\n}\n\n/**\n * Utility to create a {@link @fluidframework/datastore-definitions#IChannelFactory} classes.\n * @remarks\n * Use {@link makeSharedObjectKind} instead unless exposing the factory is required for legacy API compatibility.\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction makeChannelFactory<T extends object>(options: SharedObjectOptions<T>) {\n\tclass ChannelFactory implements IChannelFactory<T> {\n\t\t/**\n\t\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.\"type\"}\n\t\t */\n\t\tpublic static readonly Type = options.type;\n\n\t\t/**\n\t\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.attributes}\n\t\t */\n\t\tpublic static readonly Attributes: IChannelAttributes = options.attributes;\n\n\t\t/**\n\t\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.\"type\"}\n\t\t */\n\t\tpublic get type(): string {\n\t\t\treturn ChannelFactory.Type;\n\t\t}\n\n\t\t/**\n\t\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.attributes}\n\t\t */\n\t\tpublic get attributes(): IChannelAttributes {\n\t\t\treturn ChannelFactory.Attributes;\n\t\t}\n\n\t\t/**\n\t\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t\t */\n\t\tpublic async load(\n\t\t\truntime: IFluidDataStoreRuntime,\n\t\t\tid: string,\n\t\t\tservices: IChannelServices,\n\t\t\tattributes: IChannelAttributes,\n\t\t): Promise<T & IChannel> {\n\t\t\tconst shared = new SharedObjectFromKernel(\n\t\t\t\tid,\n\t\t\t\truntime,\n\t\t\t\tattributes,\n\t\t\t\toptions.factory,\n\t\t\t\toptions.telemetryContextPrefix,\n\t\t\t);\n\t\t\tawait shared.load(services);\n\t\t\treturn shared as unknown as T & IChannel;\n\t\t}\n\n\t\t/**\n\t\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.create}\n\t\t */\n\t\tpublic create(runtime: IFluidDataStoreRuntime, id: string): T & IChannel {\n\t\t\tconst shared = new SharedObjectFromKernel(\n\t\t\t\tid,\n\t\t\t\truntime,\n\t\t\t\tChannelFactory.Attributes,\n\t\t\t\toptions.factory,\n\t\t\t\toptions.telemetryContextPrefix,\n\t\t\t);\n\n\t\t\tshared.initializeLocal();\n\n\t\t\treturn shared as unknown as T & IChannel;\n\t\t}\n\t}\n\n\treturn ChannelFactory;\n}\n\n/**\n * Utility to create a {@link SharedObjectKind}.\n * @privateRemarks\n * Using this API avoids having to subclasses any Fluid Framework types,\n * reducing the coupling between the framework and the SharedObject implementation.\n * @internal\n */\nexport function makeSharedObjectKind<T extends object>(\n\toptions: SharedObjectOptions<T>,\n): ISharedObjectKind<T> & SharedObjectKind<T> {\n\treturn createSharedObjectKind<T>(makeChannelFactory(options));\n}\n"]}
package/dist/types.d.ts CHANGED
@@ -31,7 +31,19 @@ export interface ISharedObjectEvents extends IErrorEvent {
31
31
  (event: "op", listener: (op: ISequencedDocumentMessage, local: boolean, target: IEventThisPlaceHolder) => void): any;
32
32
  }
33
33
  /**
34
- * Base interface for shared objects from which other interfaces derive. Implemented by SharedObject
34
+ * Base interface for shared objects from which other interfaces extend.
35
+ * @remarks
36
+ * This interface is not intended to be implemented outside this repository:
37
+ * implementers should migrate to using an existing implementation instead.
38
+ * @privateRemarks
39
+ * Implemented by {@link SharedObjectCore}.
40
+ *
41
+ * TODO:
42
+ * The relationship between the "shared object" abstraction and "channel" abstraction should be clarified and/or unified.
43
+ * Either there should be a single named abstraction or the docs here need to make it clear why adding events and bindToContext to a channel makes it a "shared object".
44
+ * Additionally the docs here need to define what a shared object is, not just claim this interface is for them.
45
+ * If the intention is that the "shared object" concept `IFluidLoadable` mentions is only ever implemented by this interface then even more concept unification should be done.
46
+ * If not then more clarity is needed on what this interface specifically is, what the other "shared object" concept means and how they relate.
35
47
  * @legacy
36
48
  * @alpha
37
49
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAExF;;;;GAIG;AACH,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACvD;;;;;;;OAOG;IACH,CACC,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CACT,EAAE,EAAE,yBAAyB,EAC7B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,qBAAqB,KACzB,IAAI,OACR;IAEF;;;;;;;OAOG;IACH,CACC,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CACT,EAAE,EAAE,yBAAyB,EAC7B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,qBAAqB,KACzB,IAAI,OACR;CACF;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,MAAM,SAAS,mBAAmB,GAAG,mBAAmB,CACtF,SAAQ,QAAQ,EACf,cAAc,CAAC,MAAM,CAAC;IACvB;;;OAGG;IACH,aAAa,IAAI,IAAI,CAAC;CACtB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAExF;;;;GAIG;AACH,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACvD;;;;;;;OAOG;IACH,CACC,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CACT,EAAE,EAAE,yBAAyB,EAC7B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,qBAAqB,KACzB,IAAI,OACR;IAEF;;;;;;;OAOG;IACH,CACC,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CACT,EAAE,EAAE,yBAAyB,EAC7B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,qBAAqB,KACzB,IAAI,OACR;CACF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,aAAa,CAAC,MAAM,SAAS,mBAAmB,GAAG,mBAAmB,CACtF,SAAQ,QAAQ,EACf,cAAc,CAAC,MAAM,CAAC;IACvB;;;OAGG;IACH,aAAa,IAAI,IAAI,CAAC;CACtB"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.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 {\n\tIErrorEvent,\n\tIEventProvider,\n\tIEventThisPlaceHolder,\n} from \"@fluidframework/core-interfaces\";\nimport { IChannel } from \"@fluidframework/datastore-definitions/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\n/**\n * Events emitted by {@link ISharedObject}.\n * @legacy\n * @alpha\n */\nexport interface ISharedObjectEvents extends IErrorEvent {\n\t/**\n\t * Fires before an incoming operation (op) is applied to the shared object.\n\t *\n\t * @remarks Note: this should be considered an internal implementation detail. It is not recommended for external\n\t * use.\n\t *\n\t * @eventProperty\n\t */\n\t(\n\t\tevent: \"pre-op\",\n\t\tlistener: (\n\t\t\top: ISequencedDocumentMessage,\n\t\t\tlocal: boolean,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t);\n\n\t/**\n\t * Fires after an incoming op is applied to the shared object.\n\t *\n\t * @remarks Note: this should be considered an internal implementation detail. It is not recommended for external\n\t * use.\n\t *\n\t * @eventProperty\n\t */\n\t(\n\t\tevent: \"op\",\n\t\tlistener: (\n\t\t\top: ISequencedDocumentMessage,\n\t\t\tlocal: boolean,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t);\n}\n\n/**\n * Base interface for shared objects from which other interfaces derive. Implemented by SharedObject\n * @legacy\n * @alpha\n */\nexport interface ISharedObject<TEvent extends ISharedObjectEvents = ISharedObjectEvents>\n\textends IChannel,\n\t\tIEventProvider<TEvent> {\n\t/**\n\t * Binds the given shared object to its containing data store runtime, causing it to attach once\n\t * the runtime attaches.\n\t */\n\tbindToContext(): void;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.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 {\n\tIErrorEvent,\n\tIEventProvider,\n\tIEventThisPlaceHolder,\n} from \"@fluidframework/core-interfaces\";\nimport { IChannel } from \"@fluidframework/datastore-definitions/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\n/**\n * Events emitted by {@link ISharedObject}.\n * @legacy\n * @alpha\n */\nexport interface ISharedObjectEvents extends IErrorEvent {\n\t/**\n\t * Fires before an incoming operation (op) is applied to the shared object.\n\t *\n\t * @remarks Note: this should be considered an internal implementation detail. It is not recommended for external\n\t * use.\n\t *\n\t * @eventProperty\n\t */\n\t(\n\t\tevent: \"pre-op\",\n\t\tlistener: (\n\t\t\top: ISequencedDocumentMessage,\n\t\t\tlocal: boolean,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t);\n\n\t/**\n\t * Fires after an incoming op is applied to the shared object.\n\t *\n\t * @remarks Note: this should be considered an internal implementation detail. It is not recommended for external\n\t * use.\n\t *\n\t * @eventProperty\n\t */\n\t(\n\t\tevent: \"op\",\n\t\tlistener: (\n\t\t\top: ISequencedDocumentMessage,\n\t\t\tlocal: boolean,\n\t\t\ttarget: IEventThisPlaceHolder,\n\t\t) => void,\n\t);\n}\n\n/**\n * Base interface for shared objects from which other interfaces extend.\n * @remarks\n * This interface is not intended to be implemented outside this repository:\n * implementers should migrate to using an existing implementation instead.\n * @privateRemarks\n * Implemented by {@link SharedObjectCore}.\n *\n * TODO:\n * The relationship between the \"shared object\" abstraction and \"channel\" abstraction should be clarified and/or unified.\n * Either there should be a single named abstraction or the docs here need to make it clear why adding events and bindToContext to a channel makes it a \"shared object\".\n * Additionally the docs here need to define what a shared object is, not just claim this interface is for them.\n * If the intention is that the \"shared object\" concept `IFluidLoadable` mentions is only ever implemented by this interface then even more concept unification should be done.\n * If not then more clarity is needed on what this interface specifically is, what the other \"shared object\" concept means and how they relate.\n * @legacy\n * @alpha\n */\nexport interface ISharedObject<TEvent extends ISharedObjectEvents = ISharedObjectEvents>\n\textends IChannel,\n\t\tIEventProvider<TEvent> {\n\t/**\n\t * Binds the given shared object to its containing data store runtime, causing it to attach once\n\t * the runtime attaches.\n\t */\n\tbindToContext(): void;\n}\n"]}
@@ -14,6 +14,6 @@ import { FluidSerializer } from "./serializer.js";
14
14
  export declare class GCHandleVisitor extends FluidSerializer {
15
15
  private readonly visitedHandlePaths;
16
16
  getVisitedHandlePaths(): string[];
17
- protected bindAndEncodeHandle(handle: IFluidHandleInternal, bind: IFluidHandleInternal): ISerializedHandle;
17
+ protected bindAndEncodeHandle(handle: IFluidHandleInternal): ISerializedHandle;
18
18
  }
19
19
  //# sourceMappingURL=gcHandleVisitor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gcHandleVisitor.d.ts","sourceRoot":"","sources":["../src/gcHandleVisitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAEhF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,eAAe;IACnD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA0B;IACtD,qBAAqB,IAAI,MAAM,EAAE;IAIxC,SAAS,CAAC,mBAAmB,CAC5B,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,oBAAoB,GACxB,iBAAiB;CAUpB"}
1
+ {"version":3,"file":"gcHandleVisitor.d.ts","sourceRoot":"","sources":["../src/gcHandleVisitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAEhF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,eAAe;IACnD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA0B;IACtD,qBAAqB,IAAI,MAAM,EAAE;IAIxC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,iBAAiB;CAU9E"}
@@ -17,7 +17,7 @@ export class GCHandleVisitor extends FluidSerializer {
17
17
  getVisitedHandlePaths() {
18
18
  return [...this.visitedHandlePaths];
19
19
  }
20
- bindAndEncodeHandle(handle, bind) {
20
+ bindAndEncodeHandle(handle) {
21
21
  this.visitedHandlePaths.add(handle.absolutePath);
22
22
  // Just return a dummy value. The serialization itself is not used.
23
23
  // It's especially important we don't bind since that has side effects that are irrelevant to GC.
@@ -1 +1 @@
1
- {"version":3,"file":"gcHandleVisitor.js","sourceRoot":"","sources":["../src/gcHandleVisitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,OAAO,eAAgB,SAAQ,eAAe;IAApD;;QACkB,uBAAkB,GAAgB,IAAI,GAAG,EAAE,CAAC;IAkB9D,CAAC;IAjBO,qBAAqB;QAC3B,OAAO,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACrC,CAAC;IAES,mBAAmB,CAC5B,MAA4B,EAC5B,IAA0B;QAE1B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAEjD,mEAAmE;QACnE,iGAAiG;QACjG,OAAO;YACN,IAAI,EAAE,kBAAkB;YACxB,GAAG,EAAE,8BAA8B;SACnC,CAAC;IACH,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { type IFluidHandleInternal } from \"@fluidframework/core-interfaces/internal\";\nimport { type ISerializedHandle } from \"@fluidframework/runtime-utils/internal\";\n\nimport { FluidSerializer } from \"./serializer.js\";\n\n/**\n * Implementation of IFluidSerializer used by GC to visit all the handles in the DDS to collect its outbound routes\n *\n * @remarks - This is given to DDS code that typically produces a serialization of the data, which is then ignored.\n * All that is needed is getSerializedRoutes() to get the routes. This strategy could be optimized if needed.\n */\nexport class GCHandleVisitor extends FluidSerializer {\n\tprivate readonly visitedHandlePaths: Set<string> = new Set();\n\tpublic getVisitedHandlePaths(): string[] {\n\t\treturn [...this.visitedHandlePaths];\n\t}\n\n\tprotected bindAndEncodeHandle(\n\t\thandle: IFluidHandleInternal,\n\t\tbind: IFluidHandleInternal,\n\t): ISerializedHandle {\n\t\tthis.visitedHandlePaths.add(handle.absolutePath);\n\n\t\t// Just return a dummy value. The serialization itself is not used.\n\t\t// It's especially important we don't bind since that has side effects that are irrelevant to GC.\n\t\treturn {\n\t\t\ttype: \"__fluid_handle__\",\n\t\t\turl: \"UNUSED (see GCHandleVisitor)\",\n\t\t};\n\t}\n}\n"]}
1
+ {"version":3,"file":"gcHandleVisitor.js","sourceRoot":"","sources":["../src/gcHandleVisitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,OAAO,eAAgB,SAAQ,eAAe;IAApD;;QACkB,uBAAkB,GAAgB,IAAI,GAAG,EAAE,CAAC;IAe9D,CAAC;IAdO,qBAAqB;QAC3B,OAAO,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACrC,CAAC;IAES,mBAAmB,CAAC,MAA4B;QACzD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAEjD,mEAAmE;QACnE,iGAAiG;QACjG,OAAO;YACN,IAAI,EAAE,kBAAkB;YACxB,GAAG,EAAE,8BAA8B;SACnC,CAAC;IACH,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { type IFluidHandleInternal } from \"@fluidframework/core-interfaces/internal\";\nimport { type ISerializedHandle } from \"@fluidframework/runtime-utils/internal\";\n\nimport { FluidSerializer } from \"./serializer.js\";\n\n/**\n * Implementation of IFluidSerializer used by GC to visit all the handles in the DDS to collect its outbound routes\n *\n * @remarks - This is given to DDS code that typically produces a serialization of the data, which is then ignored.\n * All that is needed is getSerializedRoutes() to get the routes. This strategy could be optimized if needed.\n */\nexport class GCHandleVisitor extends FluidSerializer {\n\tprivate readonly visitedHandlePaths: Set<string> = new Set();\n\tpublic getVisitedHandlePaths(): string[] {\n\t\treturn [...this.visitedHandlePaths];\n\t}\n\n\tprotected bindAndEncodeHandle(handle: IFluidHandleInternal): ISerializedHandle {\n\t\tthis.visitedHandlePaths.add(handle.absolutePath);\n\n\t\t// Just return a dummy value. The serialization itself is not used.\n\t\t// It's especially important we don't bind since that has side effects that are irrelevant to GC.\n\t\treturn {\n\t\t\ttype: \"__fluid_handle__\",\n\t\t\turl: \"UNUSED (see GCHandleVisitor)\",\n\t\t};\n\t}\n}\n"]}
package/lib/handle.d.ts CHANGED
@@ -6,6 +6,26 @@ import { type IFluidHandleInternal } from "@fluidframework/core-interfaces/inter
6
6
  import { FluidObjectHandle } from "@fluidframework/datastore/internal";
7
7
  import type { IFluidDataStoreRuntimeExperimental } from "@fluidframework/datastore-definitions/internal";
8
8
  import { ISharedObject } from "./types.js";
9
+ /**
10
+ * Handle for a shared object. See also {@link SharedObjectHandle}.
11
+ * Supports binding other handles to the underlying Shared Object (see {@link ISharedObjectHandle.bind}).
12
+ *
13
+ * @internal
14
+ */
15
+ export interface ISharedObjectHandle extends IFluidHandleInternal<ISharedObject> {
16
+ /**
17
+ * Binds the given handle to this DDS or attach the given handle if this DDS is attached.
18
+ * A bound handle will also be attached once this DDS is attached.
19
+ *
20
+ * @param handle - The target handle to bind to this DDS
21
+ */
22
+ bind(handle: IFluidHandleInternal): void;
23
+ }
24
+ /**
25
+ * Type guard for {@link ISharedObjectHandle}.
26
+ * @internal
27
+ */
28
+ export declare function isISharedObjectHandle(handle: unknown): handle is ISharedObjectHandle;
9
29
  /**
10
30
  * Handle for a shared object.
11
31
  *
@@ -17,7 +37,7 @@ import { ISharedObject } from "./types.js";
17
37
  * {@link @fluidframework/datastore#FluidDataStoreRuntime.request} recognizes requests in the form of
18
38
  * '/\<shared object id\>' and loads shared object.
19
39
  */
20
- export declare class SharedObjectHandle extends FluidObjectHandle<ISharedObject> {
40
+ export declare class SharedObjectHandle extends FluidObjectHandle<ISharedObject> implements ISharedObjectHandle {
21
41
  protected readonly value: ISharedObject;
22
42
  private readonly runtime;
23
43
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,gDAAgD,CAAC;AAEzG,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,qBAAa,kBAAmB,SAAQ,iBAAiB,CAAC,aAAa,CAAC;IAgBtE,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa;IAGvC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAlBzB;;OAEG;IACH,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED;;;;;;OAMG;gBAEiB,KAAK,EAAE,aAAa,EACvC,IAAI,EAAE,MAAM,EAEK,OAAO,EAAE,kCAAkC;IAK7D;;;OAGG;IACI,WAAW,IAAI,IAAI;IAKnB,IAAI,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;CAQ/C"}
1
+ {"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,gDAAgD,CAAC;AAGzG,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB,CAAC,aAAa,CAAC;IAC/E;;;;;OAKG;IACH,IAAI,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,mBAAmB,CAEpF;AAED;;;;;;;;;;GAUG;AACH,qBAAa,kBACZ,SAAQ,iBAAiB,CAAC,aAAa,CACvC,YAAW,mBAAmB;IAiB7B,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa;IAGvC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAlBzB;;OAEG;IACH,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED;;;;;;OAMG;gBAEiB,KAAK,EAAE,aAAa,EACvC,IAAI,EAAE,MAAM,EAEK,OAAO,EAAE,kCAAkC;IAK7D;;;OAGG;IACI,WAAW,IAAI,IAAI;IAKnB,IAAI,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;CAQ/C"}
package/lib/handle.js CHANGED
@@ -3,6 +3,14 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { FluidObjectHandle } from "@fluidframework/datastore/internal";
6
+ import { isFluidHandle } from "@fluidframework/runtime-utils";
7
+ /**
8
+ * Type guard for {@link ISharedObjectHandle}.
9
+ * @internal
10
+ */
11
+ export function isISharedObjectHandle(handle) {
12
+ return isFluidHandle(handle) && typeof handle.bind === "function";
13
+ }
6
14
  /**
7
15
  * Handle for a shared object.
8
16
  *
package/lib/handle.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"handle.js","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAMvE;;;;;;;;;;GAUG;AACH,MAAM,OAAO,kBAAmB,SAAQ,iBAAgC;IACvE;;OAEG;IACH,IAAW,UAAU;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACH,YACoB,KAAoB,EACvC,IAAY;IACZ,gDAAgD;IAC/B,OAA2C;QAE5D,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAL7B,UAAK,GAAL,KAAK,CAAe;QAGtB,YAAO,GAAP,OAAO,CAAoC;IAG7D,CAAC;IAED;;;OAGG;IACI,WAAW;QACjB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAEM,IAAI,CAAC,MAA4B;QACvC,mFAAmF;QACnF,8GAA8G;QAC9G,wEAAwE;QACxE,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;IACF,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { type IFluidHandleInternal } from \"@fluidframework/core-interfaces/internal\";\nimport { FluidObjectHandle } from \"@fluidframework/datastore/internal\";\n// eslint-disable-next-line import/no-deprecated\nimport type { IFluidDataStoreRuntimeExperimental } from \"@fluidframework/datastore-definitions/internal\";\n\nimport { ISharedObject } from \"./types.js\";\n\n/**\n * Handle for a shared object.\n *\n * @remarks\n *\n * This object is used for already loaded (in-memory) shared objects and is used only for serialization purposes.\n *\n * De-serialization process goes through {@link @fluidframework/datastore#FluidObjectHandle}, and request flow:\n * {@link @fluidframework/datastore#FluidDataStoreRuntime.request} recognizes requests in the form of\n * '/\\<shared object id\\>' and loads shared object.\n */\nexport class SharedObjectHandle extends FluidObjectHandle<ISharedObject> {\n\t/**\n\t * Whether services have been attached for the associated shared object.\n\t */\n\tpublic get isAttached(): boolean {\n\t\treturn this.value.isAttached();\n\t}\n\n\t/**\n\t * Creates a new SharedObjectHandle.\n\t * @param value - The shared object this handle is for.\n\t * @param path - The id of the shared object. It is also the path to this object relative to the routeContext.\n\t * @param routeContext - The parent {@link @fluidframework/core-interfaces#IFluidHandleContext} that has a route\n\t * to this handle.\n\t */\n\tconstructor(\n\t\tprotected readonly value: ISharedObject,\n\t\tpath: string,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tprivate readonly runtime: IFluidDataStoreRuntimeExperimental,\n\t) {\n\t\tsuper(value, path, runtime.IFluidHandleContext);\n\t}\n\n\t/**\n\t * Attaches all bound handles first (which may in turn attach further handles), then attaches this handle.\n\t * When attaching the handle, it registers the associated shared object.\n\t */\n\tpublic attachGraph(): void {\n\t\tthis.value.bindToContext();\n\t\tsuper.attachGraph();\n\t}\n\n\tpublic bind(handle: IFluidHandleInternal): void {\n\t\t// We don't bind handles in staging mode to defer the attachment of any new objects\n\t\t// until we've exited staging mode. This way if we discard changes or a new handle is not present in the final\n\t\t// committed state, we will never end up attaching the discarded object.\n\t\tif (this.runtime.inStagingMode !== true) {\n\t\t\tsuper.bind(handle);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"handle.js","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAGvE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAoB9D;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACpD,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,OAAQ,MAA8B,CAAC,IAAI,KAAK,UAAU,CAAC;AAC5F,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,OAAO,kBACZ,SAAQ,iBAAgC;IAGxC;;OAEG;IACH,IAAW,UAAU;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACH,YACoB,KAAoB,EACvC,IAAY;IACZ,gDAAgD;IAC/B,OAA2C;QAE5D,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAL7B,UAAK,GAAL,KAAK,CAAe;QAGtB,YAAO,GAAP,OAAO,CAAoC;IAG7D,CAAC;IAED;;;OAGG;IACI,WAAW;QACjB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAEM,IAAI,CAAC,MAA4B;QACvC,mFAAmF;QACnF,8GAA8G;QAC9G,wEAAwE;QACxE,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;IACF,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { type IFluidHandleInternal } from \"@fluidframework/core-interfaces/internal\";\nimport { FluidObjectHandle } from \"@fluidframework/datastore/internal\";\n// eslint-disable-next-line import/no-deprecated\nimport type { IFluidDataStoreRuntimeExperimental } from \"@fluidframework/datastore-definitions/internal\";\nimport { isFluidHandle } from \"@fluidframework/runtime-utils\";\n\nimport { ISharedObject } from \"./types.js\";\n\n/**\n * Handle for a shared object. See also {@link SharedObjectHandle}.\n * Supports binding other handles to the underlying Shared Object (see {@link ISharedObjectHandle.bind}).\n *\n * @internal\n */\nexport interface ISharedObjectHandle extends IFluidHandleInternal<ISharedObject> {\n\t/**\n\t * Binds the given handle to this DDS or attach the given handle if this DDS is attached.\n\t * A bound handle will also be attached once this DDS is attached.\n\t *\n\t * @param handle - The target handle to bind to this DDS\n\t */\n\tbind(handle: IFluidHandleInternal): void;\n}\n\n/**\n * Type guard for {@link ISharedObjectHandle}.\n * @internal\n */\nexport function isISharedObjectHandle(handle: unknown): handle is ISharedObjectHandle {\n\treturn isFluidHandle(handle) && typeof (handle as ISharedObjectHandle).bind === \"function\";\n}\n\n/**\n * Handle for a shared object.\n *\n * @remarks\n *\n * This object is used for already loaded (in-memory) shared objects and is used only for serialization purposes.\n *\n * De-serialization process goes through {@link @fluidframework/datastore#FluidObjectHandle}, and request flow:\n * {@link @fluidframework/datastore#FluidDataStoreRuntime.request} recognizes requests in the form of\n * '/\\<shared object id\\>' and loads shared object.\n */\nexport class SharedObjectHandle\n\textends FluidObjectHandle<ISharedObject>\n\timplements ISharedObjectHandle\n{\n\t/**\n\t * Whether services have been attached for the associated shared object.\n\t */\n\tpublic get isAttached(): boolean {\n\t\treturn this.value.isAttached();\n\t}\n\n\t/**\n\t * Creates a new SharedObjectHandle.\n\t * @param value - The shared object this handle is for.\n\t * @param path - The id of the shared object. It is also the path to this object relative to the routeContext.\n\t * @param routeContext - The parent {@link @fluidframework/core-interfaces#IFluidHandleContext} that has a route\n\t * to this handle.\n\t */\n\tconstructor(\n\t\tprotected readonly value: ISharedObject,\n\t\tpath: string,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tprivate readonly runtime: IFluidDataStoreRuntimeExperimental,\n\t) {\n\t\tsuper(value, path, runtime.IFluidHandleContext);\n\t}\n\n\t/**\n\t * Attaches all bound handles first (which may in turn attach further handles), then attaches this handle.\n\t * When attaching the handle, it registers the associated shared object.\n\t */\n\tpublic attachGraph(): void {\n\t\tthis.value.bindToContext();\n\t\tsuper.attachGraph();\n\t}\n\n\tpublic bind(handle: IFluidHandleInternal): void {\n\t\t// We don't bind handles in staging mode to defer the attachment of any new objects\n\t\t// until we've exited staging mode. This way if we discard changes or a new handle is not present in the final\n\t\t// committed state, we will never end up attaching the discarded object.\n\t\tif (this.runtime.inStagingMode !== true) {\n\t\t\tsuper.bind(handle);\n\t\t}\n\t}\n}\n"]}
package/lib/index.d.ts CHANGED
@@ -2,9 +2,11 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ export { ISharedObjectHandle, isISharedObjectHandle } from "./handle.js";
5
6
  export { FluidSerializer, IFluidSerializer } from "./serializer.js";
6
7
  export { SharedObject, SharedObjectCore, ISharedObjectKind, SharedObjectKind, createSharedObjectKind, } from "./sharedObject.js";
7
8
  export { ISharedObject, ISharedObjectEvents } from "./types.js";
8
9
  export { createSingleBlobSummary, makeHandlesSerializable, parseHandles, serializeHandles, bindHandles, type IChannelView, } from "./utils.js";
9
10
  export { ValueType } from "./valueType.js";
11
+ export { SharedKernel, thisWrap, KernelArgs, makeSharedObjectKind, SharedKernelFactory, FactoryOut, SharedObjectOptions, mergeAPIs, } from "./sharedObjectKernel.js";
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EACN,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EACN,uBAAuB,EACvB,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,KAAK,YAAY,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EACN,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EACN,uBAAuB,EACvB,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,KAAK,YAAY,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACN,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACV,mBAAmB,EACnB,SAAS,GACT,MAAM,yBAAyB,CAAC"}
package/lib/index.js CHANGED
@@ -2,8 +2,10 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ export { isISharedObjectHandle } from "./handle.js";
5
6
  export { FluidSerializer } from "./serializer.js";
6
7
  export { SharedObject, SharedObjectCore, createSharedObjectKind, } from "./sharedObject.js";
7
8
  export { createSingleBlobSummary, makeHandlesSerializable, parseHandles, serializeHandles, bindHandles, } from "./utils.js";
8
9
  export { ValueType } from "./valueType.js";
10
+ export { thisWrap, makeSharedObjectKind, mergeAPIs, } from "./sharedObjectKernel.js";
9
11
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAoB,MAAM,iBAAiB,CAAC;AACpE,OAAO,EACN,YAAY,EACZ,gBAAgB,EAGhB,sBAAsB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACN,uBAAuB,EACvB,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,WAAW,GAEX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { FluidSerializer, IFluidSerializer } from \"./serializer.js\";\nexport {\n\tSharedObject,\n\tSharedObjectCore,\n\tISharedObjectKind,\n\tSharedObjectKind,\n\tcreateSharedObjectKind,\n} from \"./sharedObject.js\";\nexport { ISharedObject, ISharedObjectEvents } from \"./types.js\";\nexport {\n\tcreateSingleBlobSummary,\n\tmakeHandlesSerializable,\n\tparseHandles,\n\tserializeHandles,\n\tbindHandles,\n\ttype IChannelView,\n} from \"./utils.js\";\nexport { ValueType } from \"./valueType.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuB,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,eAAe,EAAoB,MAAM,iBAAiB,CAAC;AACpE,OAAO,EACN,YAAY,EACZ,gBAAgB,EAGhB,sBAAsB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACN,uBAAuB,EACvB,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,WAAW,GAEX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAEN,QAAQ,EAER,oBAAoB,EAIpB,SAAS,GACT,MAAM,yBAAyB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { ISharedObjectHandle, isISharedObjectHandle } from \"./handle.js\";\nexport { FluidSerializer, IFluidSerializer } from \"./serializer.js\";\nexport {\n\tSharedObject,\n\tSharedObjectCore,\n\tISharedObjectKind,\n\tSharedObjectKind,\n\tcreateSharedObjectKind,\n} from \"./sharedObject.js\";\nexport { ISharedObject, ISharedObjectEvents } from \"./types.js\";\nexport {\n\tcreateSingleBlobSummary,\n\tmakeHandlesSerializable,\n\tparseHandles,\n\tserializeHandles,\n\tbindHandles,\n\ttype IChannelView,\n} from \"./utils.js\";\nexport { ValueType } from \"./valueType.js\";\nexport {\n\tSharedKernel,\n\tthisWrap,\n\tKernelArgs,\n\tmakeSharedObjectKind,\n\tSharedKernelFactory,\n\tFactoryOut,\n\tSharedObjectOptions,\n\tmergeAPIs,\n} from \"./sharedObjectKernel.js\";\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/shared-object-base";
8
- export declare const pkgVersion = "2.33.2";
8
+ export declare const pkgVersion = "2.40.0";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export const pkgName = "@fluidframework/shared-object-base";
8
- export const pkgVersion = "2.33.2";
8
+ export const pkgVersion = "2.40.0";
9
9
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,oCAAoC,CAAC;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/shared-object-base\";\nexport const pkgVersion = \"2.33.2\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,oCAAoC,CAAC;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/shared-object-base\";\nexport const pkgVersion = \"2.40.0\";\n"]}
@@ -5,6 +5,7 @@
5
5
  import { IFluidHandle } from "@fluidframework/core-interfaces";
6
6
  import { IFluidHandleContext, type IFluidHandleInternal } from "@fluidframework/core-interfaces/internal";
7
7
  import { type ISerializedHandle } from "@fluidframework/runtime-utils/internal";
8
+ import { type ISharedObjectHandle } from "./handle.js";
8
9
  /**
9
10
  * @legacy
10
11
  * @alpha
@@ -81,7 +82,7 @@ export declare class FluidSerializer implements IFluidSerializer {
81
82
  * If the given 'value' is an IFluidHandle, returns the encoded IFluidHandle.
82
83
  * Otherwise returns the original 'value'. Used by 'encode()' and 'stringify()'.
83
84
  */
84
- protected encodeValue(value: unknown, bind?: IFluidHandleInternal): unknown;
85
+ protected encodeValue(value: unknown, bind?: ISharedObjectHandle): unknown;
85
86
  /**
86
87
  * If the given 'value' is an encoded IFluidHandle, returns the decoded IFluidHandle.
87
88
  * Otherwise returns the original 'value'. Used by 'decode()' and 'parse()'.
@@ -100,6 +101,6 @@ export declare class FluidSerializer implements IFluidSerializer {
100
101
  * @param bind - The binding context for the handle (the handle will become attached whenever this context is attached).
101
102
  * @returns The serialized handle.
102
103
  */
103
- protected bindAndEncodeHandle(handle: IFluidHandleInternal, bind: IFluidHandleInternal): ISerializedHandle;
104
+ protected bindAndEncodeHandle(handle: IFluidHandleInternal, bind: ISharedObjectHandle): ISerializedHandle;
104
105
  }
105
106
  //# sourceMappingURL=serializer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EACN,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAMN,KAAK,iBAAiB,EAEtB,MAAM,wCAAwC,CAAC;AAEhD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC;IAEpD;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAEhC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAAC;IAEtD;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IAGpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAF3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsB;gBAEP,OAAO,EAAE,mBAAmB;IAOhE,IAAW,gBAAgB,IAAI,gBAAgB,CAE9C;IAED;;;;;;;;OAQG;IACI,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO;IASlE;;;;;;;;OAQG;IACI,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAStC;;;;OAIG;IACI,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM;IAK5D;;OAEG;IACI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIpC;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO;IAS3E;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAmB9C;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA4C1B;;;;;;OAMG;IACH,SAAS,CAAC,mBAAmB,CAC5B,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,oBAAoB,GACxB,iBAAiB;CAIpB"}
1
+ {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EACN,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAMN,KAAK,iBAAiB,EAEtB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE9E;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC;IAEpD;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAEhC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAAC;IAEtD;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IAGpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAF3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsB;gBAEP,OAAO,EAAE,mBAAmB;IAOhE,IAAW,gBAAgB,IAAI,gBAAgB,CAE9C;IAED;;;;;;;;OAQG;IACI,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO;IAUlE;;;;;;;;OAQG;IACI,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAStC;;;;OAIG;IACI,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM;IAK5D;;OAEG;IACI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIpC;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO;IAS1E;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAmB9C;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA4C1B;;;;;;OAMG;IACH,SAAS,CAAC,mBAAmB,CAC5B,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,mBAAmB,GACvB,iBAAiB;CAIpB"}
package/lib/serializer.js CHANGED
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { assert, shallowCloneObject } from "@fluidframework/core-utils/internal";
6
6
  import { encodeHandleForSerialization, generateHandleContextPath, isSerializedHandle, isFluidHandle, toFluidHandleInternal, RemoteFluidObjectHandle, } from "@fluidframework/runtime-utils/internal";
7
+ import { isISharedObjectHandle } from "./handle.js";
7
8
  /**
8
9
  * Data Store serializer implementation
9
10
  * @internal
@@ -29,6 +30,7 @@ export class FluidSerializer {
29
30
  * Any unbound handles encountered are bound to the provided IFluidHandle.
30
31
  */
31
32
  encode(input, bind) {
33
+ assert(isISharedObjectHandle(bind), 0xb8c /* bind must be an ISharedObjectHandle */);
32
34
  // If the given 'input' cannot contain handles, return it immediately. Otherwise,
33
35
  // return the result of 'recursivelyReplace()'.
34
36
  // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
@@ -59,8 +61,8 @@ export class FluidSerializer {
59
61
  * being bound to the given bind context in the process.
60
62
  */
61
63
  stringify(input, bind) {
62
- const bindInternal = toFluidHandleInternal(bind);
63
- return JSON.stringify(input, (key, value) => this.encodeValue(value, bindInternal));
64
+ assert(isISharedObjectHandle(bind), 0xb8d /* bind must be an ISharedObjectHandle */);
65
+ return JSON.stringify(input, (key, value) => this.encodeValue(value, bind));
64
66
  }
65
67
  /**
66
68
  * Parses the serialized data - context must match the context with which the JSON was stringified