@fluidframework/datastore 2.0.0-rc.1.0.4 → 2.0.0-rc.2.0.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 (117) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +4 -1
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +42 -0
  4. package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
  5. package/api-extractor-lint.json +1 -1
  6. package/api-extractor.json +1 -1
  7. package/api-report/datastore.api.md +5 -11
  8. package/dist/channelContext.d.ts +5 -4
  9. package/dist/channelContext.d.ts.map +1 -1
  10. package/dist/channelContext.js +6 -5
  11. package/dist/channelContext.js.map +1 -1
  12. package/dist/channelDeltaConnection.d.ts +6 -3
  13. package/dist/channelDeltaConnection.d.ts.map +1 -1
  14. package/dist/channelDeltaConnection.js +46 -7
  15. package/dist/channelDeltaConnection.js.map +1 -1
  16. package/dist/dataStoreRuntime.d.ts +24 -6
  17. package/dist/dataStoreRuntime.d.ts.map +1 -1
  18. package/dist/dataStoreRuntime.js +103 -36
  19. package/dist/dataStoreRuntime.js.map +1 -1
  20. package/dist/datastore-alpha.d.ts +22 -6
  21. package/dist/datastore-beta.d.ts +1 -2
  22. package/dist/datastore-public.d.ts +1 -2
  23. package/dist/datastore-untrimmed.d.ts +22 -6
  24. package/dist/index.d.ts +2 -2
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +7 -7
  27. package/dist/index.js.map +1 -1
  28. package/dist/localChannelContext.d.ts +18 -3
  29. package/dist/localChannelContext.d.ts.map +1 -1
  30. package/dist/localChannelContext.js +32 -10
  31. package/dist/localChannelContext.js.map +1 -1
  32. package/dist/package.json +3 -0
  33. package/dist/remoteChannelContext.d.ts +2 -2
  34. package/dist/remoteChannelContext.d.ts.map +1 -1
  35. package/dist/remoteChannelContext.js +6 -5
  36. package/dist/remoteChannelContext.js.map +1 -1
  37. package/dist/tsdoc-metadata.json +1 -1
  38. package/lib/{channelContext.d.mts → channelContext.d.ts} +6 -5
  39. package/lib/channelContext.d.ts.map +1 -0
  40. package/lib/{channelContext.mjs → channelContext.js} +6 -5
  41. package/lib/channelContext.js.map +1 -0
  42. package/lib/{channelDeltaConnection.d.mts → channelDeltaConnection.d.ts} +7 -4
  43. package/lib/channelDeltaConnection.d.ts.map +1 -0
  44. package/lib/channelDeltaConnection.js +92 -0
  45. package/lib/channelDeltaConnection.js.map +1 -0
  46. package/lib/{channelStorageService.d.mts → channelStorageService.d.ts} +1 -1
  47. package/lib/channelStorageService.d.ts.map +1 -0
  48. package/lib/{channelStorageService.mjs → channelStorageService.js} +1 -1
  49. package/lib/channelStorageService.js.map +1 -0
  50. package/lib/{dataStoreRuntime.d.mts → dataStoreRuntime.d.ts} +25 -7
  51. package/lib/dataStoreRuntime.d.ts.map +1 -0
  52. package/lib/{dataStoreRuntime.mjs → dataStoreRuntime.js} +100 -33
  53. package/lib/dataStoreRuntime.js.map +1 -0
  54. package/lib/{datastore-alpha.d.mts → datastore-alpha.d.ts} +22 -6
  55. package/lib/{datastore-public.d.mts → datastore-beta.d.ts} +1 -2
  56. package/lib/{datastore-beta.d.mts → datastore-public.d.ts} +1 -2
  57. package/lib/{datastore-untrimmed.d.mts → datastore-untrimmed.d.ts} +22 -6
  58. package/lib/{fluidHandle.d.mts → fluidHandle.d.ts} +1 -1
  59. package/lib/fluidHandle.d.ts.map +1 -0
  60. package/lib/{fluidHandle.mjs → fluidHandle.js} +1 -1
  61. package/lib/fluidHandle.js.map +1 -0
  62. package/lib/{index.d.mts → index.d.ts} +3 -3
  63. package/lib/index.d.ts.map +1 -0
  64. package/lib/{index.mjs → index.js} +3 -3
  65. package/lib/index.js.map +1 -0
  66. package/lib/{localChannelContext.d.mts → localChannelContext.d.ts} +19 -4
  67. package/lib/localChannelContext.d.ts.map +1 -0
  68. package/lib/{localChannelContext.mjs → localChannelContext.js} +29 -7
  69. package/lib/localChannelContext.js.map +1 -0
  70. package/lib/{localChannelStorageService.d.mts → localChannelStorageService.d.ts} +1 -1
  71. package/lib/localChannelStorageService.d.ts.map +1 -0
  72. package/lib/{localChannelStorageService.mjs → localChannelStorageService.js} +1 -1
  73. package/lib/localChannelStorageService.js.map +1 -0
  74. package/lib/{remoteChannelContext.d.mts → remoteChannelContext.d.ts} +3 -3
  75. package/lib/remoteChannelContext.d.ts.map +1 -0
  76. package/lib/{remoteChannelContext.mjs → remoteChannelContext.js} +4 -3
  77. package/lib/remoteChannelContext.js.map +1 -0
  78. package/lib/test/channelStorageService.spec.js +70 -0
  79. package/lib/test/channelStorageService.spec.js.map +1 -0
  80. package/lib/test/dataStoreRuntime.spec.js +121 -0
  81. package/lib/test/dataStoreRuntime.spec.js.map +1 -0
  82. package/lib/test/localChannelContext.spec.js +41 -0
  83. package/lib/test/localChannelContext.spec.js.map +1 -0
  84. package/lib/test/localChannelStorageService.spec.js +72 -0
  85. package/lib/test/localChannelStorageService.spec.js.map +1 -0
  86. package/lib/test/remoteChannelContext.spec.js +33 -0
  87. package/lib/test/remoteChannelContext.spec.js.map +1 -0
  88. package/lib/test/types/validateDatastorePrevious.generated.js +16 -0
  89. package/lib/test/types/validateDatastorePrevious.generated.js.map +1 -0
  90. package/package.json +48 -50
  91. package/src/channelContext.ts +6 -3
  92. package/src/channelDeltaConnection.ts +69 -5
  93. package/src/dataStoreRuntime.ts +127 -46
  94. package/src/index.ts +2 -2
  95. package/src/localChannelContext.ts +38 -5
  96. package/src/remoteChannelContext.ts +4 -2
  97. package/tsconfig.cjs.json +7 -0
  98. package/tsconfig.json +2 -5
  99. package/lib/channelContext.d.mts.map +0 -1
  100. package/lib/channelContext.mjs.map +0 -1
  101. package/lib/channelDeltaConnection.d.mts.map +0 -1
  102. package/lib/channelDeltaConnection.mjs +0 -53
  103. package/lib/channelDeltaConnection.mjs.map +0 -1
  104. package/lib/channelStorageService.d.mts.map +0 -1
  105. package/lib/channelStorageService.mjs.map +0 -1
  106. package/lib/dataStoreRuntime.d.mts.map +0 -1
  107. package/lib/dataStoreRuntime.mjs.map +0 -1
  108. package/lib/fluidHandle.d.mts.map +0 -1
  109. package/lib/fluidHandle.mjs.map +0 -1
  110. package/lib/index.d.mts.map +0 -1
  111. package/lib/index.mjs.map +0 -1
  112. package/lib/localChannelContext.d.mts.map +0 -1
  113. package/lib/localChannelContext.mjs.map +0 -1
  114. package/lib/localChannelStorageService.d.mts.map +0 -1
  115. package/lib/localChannelStorageService.mjs.map +0 -1
  116. package/lib/remoteChannelContext.d.mts.map +0 -1
  117. package/lib/remoteChannelContext.mjs.map +0 -1
@@ -4,7 +4,10 @@
4
4
  */
5
5
 
6
6
  module.exports = {
7
- extends: [require.resolve("@fluidframework/eslint-config-fluid/minimal"), "prettier"],
7
+ extends: [
8
+ require.resolve("@fluidframework/eslint-config-fluid/minimal-deprecated"),
9
+ "prettier",
10
+ ],
8
11
  parserOptions: {
9
12
  project: ["./tsconfig.json", "./src/test/tsconfig.json"],
10
13
  },
@@ -5,7 +5,7 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const getFluidTestMochaConfig = require("@fluidframework/mocha-test-setup/mocharc-common");
8
+ const getFluidTestMochaConfig = require("@fluid-internal/mocha-test-setup/mocharc-common");
9
9
 
10
10
  const packageDir = __dirname;
11
11
  const config = getFluidTestMochaConfig(packageDir);
package/CHANGELOG.md CHANGED
@@ -1,5 +1,47 @@
1
1
  # @fluidframework/datastore
2
2
 
3
+ ## 2.0.0-rc.2.0.0
4
+
5
+ ### Minor Changes
6
+
7
+ - container-runtime: New feature: ID compression for DataStores & DDSs ([#19859](https://github.com/microsoft/FluidFramework/issues/19859)) [51f0d3db73](https://github.com/microsoft/FluidFramework/commits/51f0d3db737800e1c30ea5e3952d38ff30ffc7da)
8
+
9
+ ### Key changes
10
+
11
+ 1. A new API IContainerRuntimeBase.generateDocumentUniqueId() is exposed. This API will opportunistically generate IDs in short format (non-negative numbers). If it can't achieve that, it will return UUID strings. UUIDs generated will have low entropy in groups and will compress well. It can be leveraged anywhere in container where container unique IDs are required. I.e. any place that uses uuid() and stores data in container is likely candidate to start leveraging this API.
12
+ 2. Data store internal IDs (IDs that are auto generated by FF system) will opportunistically be generated in shorter form. Data stores created in detached container will always have short IDs, data stores created in attached container will opportunistically be short (by using newly added IContainerRuntimeBase.generateDocumentUniqueId() capability)
13
+ 3. Similar DDS names will be opportunistically short (same considerations for detached DDS vs. attached DDS)
14
+
15
+ ### Implementation details
16
+
17
+ 1. Container level ID Compressor can now be enabled with delay. With such setting, only new IContainerRuntimeBase.generateDocumentUniqueId() is exposed (ID Compressor is not exposed in such case, as leveraging any of its other capabilities requires future container sessions to load ID Compressor on container load, for correctness reasons). Once Container establishes connection and any changes are made in container, newly added API will start generating more compact IDs (in most cases).
18
+
19
+ ### Breaking changes
20
+
21
+ 1. DDS names can no longer start with "\_" symbol - this is reserved for FF needs. I've validated that's not an issue for AzureClient (it only creates root object by name, everything else is referred by handle). Our main internal partners almost never use named DDSs (I can find only 4 instances in Loop).
22
+
23
+ ### Backward compatibility considerations
24
+
25
+ 1. Data store internal IDs could collide with earlier used names data stores. Earlier versions of FF framework (before DataStore aliasing feature was added) allowed customers to supply IDs for data stores. And thus, files created with earlier versions of framework could have data store IDs that will be similar to names FF will use for newly created data stores ("A", ... "Z", "a"..."z", "AA", etc.). While such collision is possible, it's very unlikely (almost impossible) if user-provided names were at least 4-5 characters long.
26
+ 2. If application runs to these problems, or wants to reduce risks, consider disabling ID compressor via IContainerRuntimeOptions.enableRuntimeIdCompressor = "off".
27
+
28
+ ### Minor changes
29
+
30
+ 1. IContainerRuntime.createDetachedRootDataStore() is removed. Please use IContainerRuntime.createDetachedDataStore and IDataStore.trySetAlias() instead
31
+ 2. IContainerRuntimeOptions.enableRuntimeIdCompressor has been changes from boolean to tri-state.
32
+
33
+ - Deprecated error-related enums have been removed ([#19067](https://github.com/microsoft/FluidFramework/issues/19067)) [59793302e5](https://github.com/microsoft/FluidFramework/commits/59793302e56784cfb6ace0e6469345f3565b3312)
34
+
35
+ Error-related enums `ContainerErrorType`, `DriverErrorType`, `OdspErrorType` and `RouterliciousErrorType` were previously
36
+ deprecated and are now removed. There are replacement object-based enumerations of `ContainerErrorTypes`,
37
+ `DriverErrorTypes`, `OdspErrorTypes` and `RouterliciousErrorTypes`. Refer to the release notes of [Fluid Framework version
38
+ 2.0.0-internal.7.0.0](https://github.com/microsoft/FluidFramework/releases/tag/client_v2.0.0-internal.7.0.0) for details
39
+ on the replacements.
40
+
41
+ - container-definitions: ILoaderOptions no longer accepts arbitrary key/value pairs ([#19306](https://github.com/microsoft/FluidFramework/issues/19306)) [741926e225](https://github.com/microsoft/FluidFramework/commits/741926e2253a161504ecc6a6451d8f15d7ac4ed6)
42
+
43
+ ILoaderOptions has been narrowed to the specific set of supported loader options, and may no longer be used to pass arbitrary key/value pairs through to the runtime.
44
+
3
45
  ## 2.0.0-rc.1.0.0
4
46
 
5
47
  ### Minor Changes
@@ -1,4 +1,8 @@
1
1
  {
2
2
  "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
3
- "extends": "../../../common/build/build-common/api-extractor-base-esm.json"
3
+ "extends": "../../../common/build/build-common/api-extractor-base.cjs.primary.json",
4
+ // CJS is actually secondary; so, no report.
5
+ "apiReport": {
6
+ "enabled": false
7
+ }
4
8
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
3
- "extends": "../../../common/build/build-common/api-extractor-lint.json"
3
+ "extends": "../../../common/build/build-common/api-extractor-lint.esm.primary.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
3
- "extends": "../../../common/build/build-common/api-extractor-base.json"
3
+ "extends": "../../../common/build/build-common/api-extractor-base.esm.primary.json"
4
4
  }
@@ -19,9 +19,8 @@ import { IFluidDataStoreRuntimeEvents } from '@fluidframework/datastore-definiti
19
19
  import { IFluidHandle } from '@fluidframework/core-interfaces';
20
20
  import { IFluidHandleContext } from '@fluidframework/core-interfaces';
21
21
  import { IGarbageCollectionData } from '@fluidframework/runtime-definitions';
22
- import { IIdCompressor } from '@fluidframework/runtime-definitions';
22
+ import { IIdCompressor } from '@fluidframework/id-compressor';
23
23
  import { IInboundSignalMessage } from '@fluidframework/runtime-definitions';
24
- import { ILoaderOptions } from '@fluidframework/container-definitions';
25
24
  import { IQuorumClients } from '@fluidframework/protocol-definitions';
26
25
  import { IRequest } from '@fluidframework/core-interfaces';
27
26
  import { IResponse } from '@fluidframework/core-interfaces';
@@ -63,7 +62,7 @@ export class FluidDataStoreRuntime extends TypedEventEmitter<IFluidDataStoreRunt
63
62
  // (undocumented)
64
63
  get connected(): boolean;
65
64
  // (undocumented)
66
- createChannel(id: string | undefined, type: string): IChannel;
65
+ createChannel(idArg: string | undefined, type: string): IChannel;
67
66
  // (undocumented)
68
67
  readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;
69
68
  // (undocumented)
@@ -71,8 +70,8 @@ export class FluidDataStoreRuntime extends TypedEventEmitter<IFluidDataStoreRunt
71
70
  // (undocumented)
72
71
  get disposed(): boolean;
73
72
  ensureNoDataModelChanges<T>(callback: () => T): T;
74
- // (undocumented)
75
73
  readonly entryPoint: IFluidHandle<FluidObject>;
74
+ getAttachGCData(telemetryContext?: ITelemetryContext): IGarbageCollectionData;
76
75
  // (undocumented)
77
76
  getAttachSummary(telemetryContext?: ITelemetryContext): ISummaryTreeWithStats;
78
77
  // (undocumented)
@@ -96,7 +95,7 @@ export class FluidDataStoreRuntime extends TypedEventEmitter<IFluidDataStoreRunt
96
95
  // (undocumented)
97
96
  get objectsRoutingContext(): this;
98
97
  // (undocumented)
99
- readonly options: ILoaderOptions;
98
+ readonly options: Record<string | number, any>;
100
99
  // (undocumented)
101
100
  process(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown): void;
102
101
  // (undocumented)
@@ -120,6 +119,7 @@ export class FluidDataStoreRuntime extends TypedEventEmitter<IFluidDataStoreRunt
120
119
  updateUsedRoutes(usedRoutes: string[]): void;
121
120
  // (undocumented)
122
121
  uploadBlob(blob: ArrayBufferLike, signal?: AbortSignal): Promise<IFluidHandle<ArrayBufferLike>>;
122
+ protected validateChannelId(id: string): void;
123
123
  // (undocumented)
124
124
  visibilityState: VisibilityState;
125
125
  waitAttached(): Promise<void>;
@@ -128,17 +128,11 @@ export class FluidDataStoreRuntime extends TypedEventEmitter<IFluidDataStoreRunt
128
128
  // @alpha
129
129
  export class FluidObjectHandle<T extends FluidObject = FluidObject> implements IFluidHandle {
130
130
  constructor(value: T | Promise<T>, path: string, routeContext: IFluidHandleContext);
131
- // (undocumented)
132
131
  readonly absolutePath: string;
133
- // (undocumented)
134
132
  attachGraph(): void;
135
- // (undocumented)
136
133
  bind(handle: IFluidHandle): void;
137
- // (undocumented)
138
134
  get(): Promise<any>;
139
- // (undocumented)
140
135
  get IFluidHandle(): IFluidHandle;
141
- // (undocumented)
142
136
  get isAttached(): boolean;
143
137
  // (undocumented)
144
138
  readonly path: string;
@@ -8,9 +8,9 @@ import { IChannel, IChannelAttributes, IChannelFactory, IFluidDataStoreRuntime }
8
8
  import { IDocumentStorageService } from "@fluidframework/driver-definitions";
9
9
  import { ISequencedDocumentMessage, ISnapshotTree } from "@fluidframework/protocol-definitions";
10
10
  import { IGarbageCollectionData, IExperimentalIncrementalSummaryContext, ISummarizeResult, ISummaryTreeWithStats, ITelemetryContext, IFluidDataStoreContext } from "@fluidframework/runtime-definitions";
11
- import { ChannelStorageService } from "./channelStorageService";
12
- import { ChannelDeltaConnection } from "./channelDeltaConnection";
13
- import { ISharedObjectRegistry } from "./dataStoreRuntime";
11
+ import { ChannelStorageService } from "./channelStorageService.js";
12
+ import { ChannelDeltaConnection } from "./channelDeltaConnection.js";
13
+ import { ISharedObjectRegistry } from "./dataStoreRuntime.js";
14
14
  export declare const attributesBlobKey = ".attributes";
15
15
  export interface IChannelContext {
16
16
  getChannel(): Promise<IChannel>;
@@ -38,7 +38,8 @@ export interface ChannelServiceEndpoints {
38
38
  deltaConnection: ChannelDeltaConnection;
39
39
  objectStorage: ChannelStorageService;
40
40
  }
41
- export declare function createChannelServiceEndpoints(connected: boolean, submitFn: (content: any, localOpMetadata: unknown) => void, dirtyFn: () => void, addedGCOutboundReferenceFn: (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) => void, storageService: IDocumentStorageService, logger: ITelemetryLoggerExt, tree?: ISnapshotTree, extraBlobs?: Map<string, ArrayBufferLike>): ChannelServiceEndpoints;
41
+ export declare function createChannelServiceEndpoints(connected: boolean, submitFn: (content: any, localOpMetadata: unknown) => void, dirtyFn: () => void, addedGCOutboundReferenceFn: (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) => void, isAttachedAndVisible: () => boolean, storageService: IDocumentStorageService, logger: ITelemetryLoggerExt, tree?: ISnapshotTree, extraBlobs?: Map<string, ArrayBufferLike>): ChannelServiceEndpoints;
42
+ /** Used to get the channel's summary for the DDS or DataStore attach op */
42
43
  export declare function summarizeChannel(channel: IChannel, fullTree?: boolean, trackState?: boolean, telemetryContext?: ITelemetryContext): ISummaryTreeWithStats;
43
44
  export declare function summarizeChannelAsync(channel: IChannel, fullTree?: boolean, trackState?: boolean, telemetryContext?: ITelemetryContext, incrementalSummaryContext?: IExperimentalIncrementalSummaryContext): Promise<ISummaryTreeWithStats>;
44
45
  export declare function loadChannelFactoryAndAttributes(dataStoreContext: IFluidDataStoreContext, services: ChannelServiceEndpoints, channelId: string, registry: ISharedObjectRegistry, attachMessageType?: string): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"channelContext.d.ts","sourceRoot":"","sources":["../src/channelContext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channelContext.d.ts","sourceRoot":"","sources":["../src/channelContext.ts"],"names":[],"mappings":"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"}
@@ -8,18 +8,19 @@ exports.loadChannel = exports.loadChannelFactoryAndAttributes = exports.summariz
8
8
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
9
9
  const runtime_utils_1 = require("@fluidframework/runtime-utils");
10
10
  const driver_utils_1 = require("@fluidframework/driver-utils");
11
- const channelStorageService_1 = require("./channelStorageService");
12
- const channelDeltaConnection_1 = require("./channelDeltaConnection");
11
+ const channelStorageService_js_1 = require("./channelStorageService.js");
12
+ const channelDeltaConnection_js_1 = require("./channelDeltaConnection.js");
13
13
  exports.attributesBlobKey = ".attributes";
14
- function createChannelServiceEndpoints(connected, submitFn, dirtyFn, addedGCOutboundReferenceFn, storageService, logger, tree, extraBlobs) {
15
- const deltaConnection = new channelDeltaConnection_1.ChannelDeltaConnection(connected, (message, localOpMetadata) => submitFn(message, localOpMetadata), dirtyFn, addedGCOutboundReferenceFn);
16
- const objectStorage = new channelStorageService_1.ChannelStorageService(tree, storageService, logger, extraBlobs);
14
+ function createChannelServiceEndpoints(connected, submitFn, dirtyFn, addedGCOutboundReferenceFn, isAttachedAndVisible, storageService, logger, tree, extraBlobs) {
15
+ const deltaConnection = new channelDeltaConnection_js_1.ChannelDeltaConnection(connected, (message, localOpMetadata) => submitFn(message, localOpMetadata), dirtyFn, addedGCOutboundReferenceFn, isAttachedAndVisible);
16
+ const objectStorage = new channelStorageService_js_1.ChannelStorageService(tree, storageService, logger, extraBlobs);
17
17
  return {
18
18
  deltaConnection,
19
19
  objectStorage,
20
20
  };
21
21
  }
22
22
  exports.createChannelServiceEndpoints = createChannelServiceEndpoints;
23
+ /** Used to get the channel's summary for the DDS or DataStore attach op */
23
24
  function summarizeChannel(channel, fullTree = false, trackState = false, telemetryContext) {
24
25
  const summarizeResult = channel.getAttachSummary(fullTree, trackState, telemetryContext);
25
26
  // Add the channel attributes to the returned result.
@@ -1 +1 @@
1
- {"version":3,"file":"channelContext.js","sourceRoot":"","sources":["../src/channelContext.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 {\n\tDataCorruptionError,\n\tITelemetryLoggerExt,\n\ttagCodeArtifacts,\n} from \"@fluidframework/telemetry-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport {\n\tIChannel,\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { ISequencedDocumentMessage, ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIGarbageCollectionData,\n\tIExperimentalIncrementalSummaryContext,\n\tISummarizeResult,\n\tISummaryTreeWithStats,\n\tITelemetryContext,\n\tIFluidDataStoreContext,\n} from \"@fluidframework/runtime-definitions\";\nimport { addBlobToSummary } from \"@fluidframework/runtime-utils\";\nimport { readAndParse } from \"@fluidframework/driver-utils\";\nimport { ChannelStorageService } from \"./channelStorageService\";\nimport { ChannelDeltaConnection } from \"./channelDeltaConnection\";\nimport { ISharedObjectRegistry } from \"./dataStoreRuntime\";\n\nexport const attributesBlobKey = \".attributes\";\n\nexport interface IChannelContext {\n\tgetChannel(): Promise<IChannel>;\n\n\tsetConnectionState(connected: boolean, clientId?: string);\n\n\tprocessOp(message: ISequencedDocumentMessage, local: boolean, localOpMetadata?: unknown): void;\n\n\tsummarize(\n\t\tfullTree?: boolean,\n\t\ttrackState?: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummarizeResult>;\n\n\treSubmit(content: any, localOpMetadata: unknown): void;\n\n\tapplyStashedOp(content: any): unknown;\n\n\trollback(message: any, localOpMetadata: unknown): void;\n\n\t/**\n\t * Returns the data used for garbage collection. This includes a list of GC nodes that represent this context\n\t * including any of its children. Each node has a set of outbound routes to other GC nodes in the document.\n\t * @param fullGC - true to bypass optimizations and force full generation of GC data.\n\t */\n\tgetGCData(fullGC?: boolean): Promise<IGarbageCollectionData>;\n\n\t/**\n\t * After GC has run, called to notify this context of routes that are used in it. These are used for the following:\n\t * 1. To identify if this context is being referenced in the document or not.\n\t * 2. To identify if this context or any of its children's used routes changed since last summary.\n\t * 3. They are added to the summary generated by this context.\n\t */\n\tupdateUsedRoutes(usedRoutes: string[]): void;\n}\n\nexport interface ChannelServiceEndpoints {\n\tdeltaConnection: ChannelDeltaConnection;\n\tobjectStorage: ChannelStorageService;\n}\n\nexport function createChannelServiceEndpoints(\n\tconnected: boolean,\n\tsubmitFn: (content: any, localOpMetadata: unknown) => void,\n\tdirtyFn: () => void,\n\taddedGCOutboundReferenceFn: (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) => void,\n\tstorageService: IDocumentStorageService,\n\tlogger: ITelemetryLoggerExt,\n\ttree?: ISnapshotTree,\n\textraBlobs?: Map<string, ArrayBufferLike>,\n): ChannelServiceEndpoints {\n\tconst deltaConnection = new ChannelDeltaConnection(\n\t\tconnected,\n\t\t(message, localOpMetadata) => submitFn(message, localOpMetadata),\n\t\tdirtyFn,\n\t\taddedGCOutboundReferenceFn,\n\t);\n\tconst objectStorage = new ChannelStorageService(tree, storageService, logger, extraBlobs);\n\n\treturn {\n\t\tdeltaConnection,\n\t\tobjectStorage,\n\t};\n}\n\nexport function summarizeChannel(\n\tchannel: IChannel,\n\tfullTree: boolean = false,\n\ttrackState: boolean = false,\n\ttelemetryContext?: ITelemetryContext,\n): ISummaryTreeWithStats {\n\tconst summarizeResult = channel.getAttachSummary(fullTree, trackState, telemetryContext);\n\n\t// Add the channel attributes to the returned result.\n\taddBlobToSummary(summarizeResult, attributesBlobKey, JSON.stringify(channel.attributes));\n\treturn summarizeResult;\n}\n\nexport async function summarizeChannelAsync(\n\tchannel: IChannel,\n\tfullTree: boolean = false,\n\ttrackState: boolean = false,\n\ttelemetryContext?: ITelemetryContext,\n\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext,\n): Promise<ISummaryTreeWithStats> {\n\tconst summarizeResult = await channel.summarize(\n\t\tfullTree,\n\t\ttrackState,\n\t\ttelemetryContext,\n\t\tincrementalSummaryContext,\n\t);\n\n\t// Add the channel attributes to the returned result.\n\taddBlobToSummary(summarizeResult, attributesBlobKey, JSON.stringify(channel.attributes));\n\treturn summarizeResult;\n}\n\nexport async function loadChannelFactoryAndAttributes(\n\tdataStoreContext: IFluidDataStoreContext,\n\tservices: ChannelServiceEndpoints,\n\tchannelId: string,\n\tregistry: ISharedObjectRegistry,\n\tattachMessageType?: string,\n): Promise<{ factory: IChannelFactory; attributes: IChannelAttributes }> {\n\tlet attributes: IChannelAttributes | undefined;\n\tif (await services.objectStorage.contains(attributesBlobKey)) {\n\t\tattributes = await readAndParse<IChannelAttributes | undefined>(\n\t\t\tservices.objectStorage,\n\t\t\tattributesBlobKey,\n\t\t);\n\t}\n\n\t// This is a backward compatibility case where the attach message doesn't include attributes. They must\n\t// include attach message type.\n\t// Since old attach messages will not have attributes, we need to keep this as long as we support old attach\n\t// messages.\n\tconst channelFactoryType = attributes ? attributes.type : attachMessageType;\n\tif (channelFactoryType === undefined) {\n\t\tthrow new DataCorruptionError(\n\t\t\t\"channelTypeNotAvailable\",\n\t\t\ttagCodeArtifacts({\n\t\t\t\tchannelId,\n\t\t\t\tdataStoreId: dataStoreContext.id,\n\t\t\t\tdataStorePackagePath: dataStoreContext.packagePath.join(\"/\"),\n\t\t\t\tchannelFactoryType,\n\t\t\t}),\n\t\t);\n\t}\n\tconst factory = registry.get(channelFactoryType);\n\tif (factory === undefined) {\n\t\tthrow new DataCorruptionError(\n\t\t\t\"channelFactoryNotRegisteredForGivenType\",\n\t\t\ttagCodeArtifacts({\n\t\t\t\tchannelId,\n\t\t\t\tdataStoreId: dataStoreContext.id,\n\t\t\t\tdataStorePackagePath: dataStoreContext.packagePath.join(\"/\"),\n\t\t\t\tchannelFactoryType,\n\t\t\t}),\n\t\t);\n\t}\n\t// This is a backward compatibility case where the attach message doesn't include attributes. Get the attributes\n\t// from the factory.\n\tattributes = attributes ?? factory.attributes;\n\treturn { factory, attributes };\n}\n\nexport async function loadChannel(\n\tdataStoreRuntime: IFluidDataStoreRuntime,\n\tattributes: IChannelAttributes,\n\tfactory: IChannelFactory,\n\tservices: ChannelServiceEndpoints,\n\tlogger: ITelemetryLoggerExt,\n\tchannelId: string,\n): Promise<IChannel> {\n\t// Compare snapshot version to collaborative object version\n\tif (\n\t\tattributes.snapshotFormatVersion !== undefined &&\n\t\tattributes.snapshotFormatVersion !== factory.attributes.snapshotFormatVersion\n\t) {\n\t\tlogger.sendTelemetryEvent({\n\t\t\teventName: \"ChannelAttributesVersionMismatch\",\n\t\t\t...tagCodeArtifacts({\n\t\t\t\tchannelType: attributes.type,\n\t\t\t\tchannelSnapshotVersion: `${attributes.snapshotFormatVersion}@${attributes.packageVersion}`,\n\t\t\t\tchannelCodeVersion: `${factory.attributes.snapshotFormatVersion}@${factory.attributes.packageVersion}`,\n\t\t\t}),\n\t\t});\n\t}\n\n\treturn factory.load(dataStoreRuntime, channelId, services, attributes);\n}\n"]}
1
+ {"version":3,"file":"channelContext.js","sourceRoot":"","sources":["../src/channelContext.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 {\n\tDataCorruptionError,\n\tITelemetryLoggerExt,\n\ttagCodeArtifacts,\n} from \"@fluidframework/telemetry-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport {\n\tIChannel,\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { ISequencedDocumentMessage, ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIGarbageCollectionData,\n\tIExperimentalIncrementalSummaryContext,\n\tISummarizeResult,\n\tISummaryTreeWithStats,\n\tITelemetryContext,\n\tIFluidDataStoreContext,\n} from \"@fluidframework/runtime-definitions\";\nimport { addBlobToSummary } from \"@fluidframework/runtime-utils\";\nimport { readAndParse } from \"@fluidframework/driver-utils\";\nimport { ChannelStorageService } from \"./channelStorageService.js\";\nimport { ChannelDeltaConnection } from \"./channelDeltaConnection.js\";\nimport { ISharedObjectRegistry } from \"./dataStoreRuntime.js\";\n\nexport const attributesBlobKey = \".attributes\";\n\nexport interface IChannelContext {\n\tgetChannel(): Promise<IChannel>;\n\n\tsetConnectionState(connected: boolean, clientId?: string);\n\n\tprocessOp(message: ISequencedDocumentMessage, local: boolean, localOpMetadata?: unknown): void;\n\n\tsummarize(\n\t\tfullTree?: boolean,\n\t\ttrackState?: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummarizeResult>;\n\n\treSubmit(content: any, localOpMetadata: unknown): void;\n\n\tapplyStashedOp(content: any): unknown;\n\n\trollback(message: any, localOpMetadata: unknown): void;\n\n\t/**\n\t * Returns the data used for garbage collection. This includes a list of GC nodes that represent this context\n\t * including any of its children. Each node has a set of outbound routes to other GC nodes in the document.\n\t * @param fullGC - true to bypass optimizations and force full generation of GC data.\n\t */\n\tgetGCData(fullGC?: boolean): Promise<IGarbageCollectionData>;\n\n\t/**\n\t * After GC has run, called to notify this context of routes that are used in it. These are used for the following:\n\t * 1. To identify if this context is being referenced in the document or not.\n\t * 2. To identify if this context or any of its children's used routes changed since last summary.\n\t * 3. They are added to the summary generated by this context.\n\t */\n\tupdateUsedRoutes(usedRoutes: string[]): void;\n}\n\nexport interface ChannelServiceEndpoints {\n\tdeltaConnection: ChannelDeltaConnection;\n\tobjectStorage: ChannelStorageService;\n}\n\nexport function createChannelServiceEndpoints(\n\tconnected: boolean,\n\tsubmitFn: (content: any, localOpMetadata: unknown) => void,\n\tdirtyFn: () => void,\n\taddedGCOutboundReferenceFn: (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) => void,\n\tisAttachedAndVisible: () => boolean,\n\tstorageService: IDocumentStorageService,\n\tlogger: ITelemetryLoggerExt,\n\ttree?: ISnapshotTree,\n\textraBlobs?: Map<string, ArrayBufferLike>,\n): ChannelServiceEndpoints {\n\tconst deltaConnection = new ChannelDeltaConnection(\n\t\tconnected,\n\t\t(message, localOpMetadata) => submitFn(message, localOpMetadata),\n\t\tdirtyFn,\n\t\taddedGCOutboundReferenceFn,\n\t\tisAttachedAndVisible,\n\t);\n\tconst objectStorage = new ChannelStorageService(tree, storageService, logger, extraBlobs);\n\n\treturn {\n\t\tdeltaConnection,\n\t\tobjectStorage,\n\t};\n}\n\n/** Used to get the channel's summary for the DDS or DataStore attach op */\nexport function summarizeChannel(\n\tchannel: IChannel,\n\tfullTree: boolean = false,\n\ttrackState: boolean = false,\n\ttelemetryContext?: ITelemetryContext,\n): ISummaryTreeWithStats {\n\tconst summarizeResult = channel.getAttachSummary(fullTree, trackState, telemetryContext);\n\n\t// Add the channel attributes to the returned result.\n\taddBlobToSummary(summarizeResult, attributesBlobKey, JSON.stringify(channel.attributes));\n\treturn summarizeResult;\n}\n\nexport async function summarizeChannelAsync(\n\tchannel: IChannel,\n\tfullTree: boolean = false,\n\ttrackState: boolean = false,\n\ttelemetryContext?: ITelemetryContext,\n\tincrementalSummaryContext?: IExperimentalIncrementalSummaryContext,\n): Promise<ISummaryTreeWithStats> {\n\tconst summarizeResult = await channel.summarize(\n\t\tfullTree,\n\t\ttrackState,\n\t\ttelemetryContext,\n\t\tincrementalSummaryContext,\n\t);\n\n\t// Add the channel attributes to the returned result.\n\taddBlobToSummary(summarizeResult, attributesBlobKey, JSON.stringify(channel.attributes));\n\treturn summarizeResult;\n}\n\nexport async function loadChannelFactoryAndAttributes(\n\tdataStoreContext: IFluidDataStoreContext,\n\tservices: ChannelServiceEndpoints,\n\tchannelId: string,\n\tregistry: ISharedObjectRegistry,\n\tattachMessageType?: string,\n): Promise<{ factory: IChannelFactory; attributes: IChannelAttributes }> {\n\tlet attributes: IChannelAttributes | undefined;\n\tif (await services.objectStorage.contains(attributesBlobKey)) {\n\t\tattributes = await readAndParse<IChannelAttributes | undefined>(\n\t\t\tservices.objectStorage,\n\t\t\tattributesBlobKey,\n\t\t);\n\t}\n\n\t// This is a backward compatibility case where the attach message doesn't include attributes. They must\n\t// include attach message type.\n\t// Since old attach messages will not have attributes, we need to keep this as long as we support old attach\n\t// messages.\n\tconst channelFactoryType = attributes ? attributes.type : attachMessageType;\n\tif (channelFactoryType === undefined) {\n\t\tthrow new DataCorruptionError(\n\t\t\t\"channelTypeNotAvailable\",\n\t\t\ttagCodeArtifacts({\n\t\t\t\tchannelId,\n\t\t\t\tdataStoreId: dataStoreContext.id,\n\t\t\t\tdataStorePackagePath: dataStoreContext.packagePath.join(\"/\"),\n\t\t\t\tchannelFactoryType,\n\t\t\t}),\n\t\t);\n\t}\n\tconst factory = registry.get(channelFactoryType);\n\tif (factory === undefined) {\n\t\tthrow new DataCorruptionError(\n\t\t\t\"channelFactoryNotRegisteredForGivenType\",\n\t\t\ttagCodeArtifacts({\n\t\t\t\tchannelId,\n\t\t\t\tdataStoreId: dataStoreContext.id,\n\t\t\t\tdataStorePackagePath: dataStoreContext.packagePath.join(\"/\"),\n\t\t\t\tchannelFactoryType,\n\t\t\t}),\n\t\t);\n\t}\n\t// This is a backward compatibility case where the attach message doesn't include attributes. Get the attributes\n\t// from the factory.\n\tattributes = attributes ?? factory.attributes;\n\treturn { factory, attributes };\n}\n\nexport async function loadChannel(\n\tdataStoreRuntime: IFluidDataStoreRuntime,\n\tattributes: IChannelAttributes,\n\tfactory: IChannelFactory,\n\tservices: ChannelServiceEndpoints,\n\tlogger: ITelemetryLoggerExt,\n\tchannelId: string,\n): Promise<IChannel> {\n\t// Compare snapshot version to collaborative object version\n\tif (\n\t\tattributes.snapshotFormatVersion !== undefined &&\n\t\tattributes.snapshotFormatVersion !== factory.attributes.snapshotFormatVersion\n\t) {\n\t\tlogger.sendTelemetryEvent({\n\t\t\teventName: \"ChannelAttributesVersionMismatch\",\n\t\t\t...tagCodeArtifacts({\n\t\t\t\tchannelType: attributes.type,\n\t\t\t\tchannelSnapshotVersion: `${attributes.snapshotFormatVersion}@${attributes.packageVersion}`,\n\t\t\t\tchannelCodeVersion: `${factory.attributes.snapshotFormatVersion}@${factory.attributes.packageVersion}`,\n\t\t\t}),\n\t\t});\n\t}\n\n\treturn factory.load(dataStoreRuntime, channelId, services, attributes);\n}\n"]}
@@ -7,21 +7,24 @@ import { IDeltaConnection, IDeltaHandler } from "@fluidframework/datastore-defin
7
7
  import { IFluidHandle } from "@fluidframework/core-interfaces";
8
8
  export declare class ChannelDeltaConnection implements IDeltaConnection {
9
9
  private _connected;
10
- readonly submit: (content: any, localOpMetadata: unknown) => void;
10
+ private readonly submitFn;
11
11
  readonly dirty: () => void;
12
12
  /** @deprecated There is no replacement for this, its functionality is no longer needed at this layer. */
13
13
  readonly addedGCOutboundReference: (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) => void;
14
+ private readonly isAttachedAndVisible;
14
15
  private _handler;
16
+ private stashedOpMd;
15
17
  private get handler();
16
18
  get connected(): boolean;
17
- constructor(_connected: boolean, submit: (content: any, localOpMetadata: unknown) => void, dirty: () => void,
19
+ constructor(_connected: boolean, submitFn: (content: any, localOpMetadata: unknown) => void, dirty: () => void,
18
20
  /** @deprecated There is no replacement for this, its functionality is no longer needed at this layer. */
19
- addedGCOutboundReference: (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) => void);
21
+ addedGCOutboundReference: (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) => void, isAttachedAndVisible: () => boolean);
20
22
  attach(handler: IDeltaHandler): void;
21
23
  setConnectionState(connected: boolean): void;
22
24
  process(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown): void;
23
25
  reSubmit(content: any, localOpMetadata: unknown): void;
24
26
  rollback(content: any, localOpMetadata: unknown): void;
25
27
  applyStashedOp(content: any): unknown;
28
+ submit(contents: any, metadata: unknown): void;
26
29
  }
27
30
  //# sourceMappingURL=channelDeltaConnection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"channelDeltaConnection.d.ts","sourceRoot":"","sources":["../src/channelDeltaConnection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAExF,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,qBAAa,sBAAuB,YAAW,gBAAgB;IAY7D,OAAO,CAAC,UAAU;aACF,MAAM,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,KAAK,IAAI;aACxD,KAAK,EAAE,MAAM,IAAI;IACjC,yGAAyG;aACzF,wBAAwB,EAAE,CACzC,SAAS,EAAE,YAAY,EACvB,cAAc,EAAE,YAAY,KACxB,IAAI;IAlBV,OAAO,CAAC,QAAQ,CAA4B;IAE5C,OAAO,KAAK,OAAO,GAGlB;IACD,IAAW,SAAS,IAAI,OAAO,CAE9B;gBAGQ,UAAU,EAAE,OAAO,EACX,MAAM,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,KAAK,IAAI,EACxD,KAAK,EAAE,MAAM,IAAI;IACjC,yGAAyG;IACzF,wBAAwB,EAAE,CACzC,SAAS,EAAE,YAAY,EACvB,cAAc,EAAE,YAAY,KACxB,IAAI;IAGH,MAAM,CAAC,OAAO,EAAE,aAAa;IAK7B,kBAAkB,CAAC,SAAS,EAAE,OAAO;IAKrC,OAAO,CAAC,OAAO,EAAE,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO;IAapF,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO;IAI/C,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO;IAO/C,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;CAG5C"}
1
+ {"version":3,"file":"channelDeltaConnection.d.ts","sourceRoot":"","sources":["../src/channelDeltaConnection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAExF,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAqC/D,qBAAa,sBAAuB,YAAW,gBAAgB;IAa7D,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;aACT,KAAK,EAAE,MAAM,IAAI;IACjC,yGAAyG;aACzF,wBAAwB,EAAE,CACzC,SAAS,EAAE,YAAY,EACvB,cAAc,EAAE,YAAY,KACxB,IAAI;IACT,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IApBtC,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,WAAW,CAAgC;IAEnD,OAAO,KAAK,OAAO,GAGlB;IACD,IAAW,SAAS,IAAI,OAAO,CAE9B;gBAGQ,UAAU,EAAE,OAAO,EACV,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,KAAK,IAAI,EAC3D,KAAK,EAAE,MAAM,IAAI;IACjC,yGAAyG;IACzF,wBAAwB,EAAE,CACzC,SAAS,EAAE,YAAY,EACvB,cAAc,EAAE,YAAY,KACxB,IAAI,EACQ,oBAAoB,EAAE,MAAM,OAAO;IAG9C,MAAM,CAAC,OAAO,EAAE,aAAa;IAK7B,kBAAkB,CAAC,SAAS,EAAE,OAAO;IAKrC,OAAO,CAAC,OAAO,EAAE,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO;IAkBpF,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO;IAQ/C,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO;IAW/C,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IAUrC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;CAOrD"}
@@ -7,6 +7,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.ChannelDeltaConnection = void 0;
8
8
  const core_utils_1 = require("@fluidframework/core-utils");
9
9
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
10
+ const stashedOpMetadataMark = Symbol();
11
+ function createStashedOpMetadata() {
12
+ const arr = [];
13
+ Object.defineProperty(arr, stashedOpMetadataMark, {
14
+ value: stashedOpMetadataMark,
15
+ writable: false,
16
+ enumerable: true,
17
+ });
18
+ return arr;
19
+ }
20
+ function isStashedOpMetadata(md) {
21
+ return (Array.isArray(md) &&
22
+ stashedOpMetadataMark in md &&
23
+ md[stashedOpMetadataMark] === stashedOpMetadataMark);
24
+ }
25
+ function processWithStashedOpMetadataHandling(content, localOpMetaData, func) {
26
+ if (isStashedOpMetadata(localOpMetaData)) {
27
+ localOpMetaData.forEach(({ contents, metadata }) => func(contents, metadata));
28
+ }
29
+ else {
30
+ func(content, localOpMetaData);
31
+ }
32
+ }
10
33
  class ChannelDeltaConnection {
11
34
  get handler() {
12
35
  (0, core_utils_1.assert)(!!this._handler, 0x177 /* "Missing delta handler" */);
@@ -15,13 +38,14 @@ class ChannelDeltaConnection {
15
38
  get connected() {
16
39
  return this._connected;
17
40
  }
18
- constructor(_connected, submit, dirty,
41
+ constructor(_connected, submitFn, dirty,
19
42
  /** @deprecated There is no replacement for this, its functionality is no longer needed at this layer. */
20
- addedGCOutboundReference) {
43
+ addedGCOutboundReference, isAttachedAndVisible) {
21
44
  this._connected = _connected;
22
- this.submit = submit;
45
+ this.submitFn = submitFn;
23
46
  this.dirty = dirty;
24
47
  this.addedGCOutboundReference = addedGCOutboundReference;
48
+ this.isAttachedAndVisible = isAttachedAndVisible;
25
49
  }
26
50
  attach(handler) {
27
51
  (0, core_utils_1.assert)(this._handler === undefined, 0x178 /* "Missing delta handler on attach" */);
@@ -34,23 +58,38 @@ class ChannelDeltaConnection {
34
58
  process(message, local, localOpMetadata) {
35
59
  try {
36
60
  // catches as data processing error whether or not they come from async pending queues
37
- this.handler.process(message, local, localOpMetadata);
61
+ processWithStashedOpMetadataHandling(message.contents, localOpMetadata, (contents, metadata) => this.handler.process({ ...message, contents }, local, metadata));
38
62
  }
39
63
  catch (error) {
40
64
  throw telemetry_utils_1.DataProcessingError.wrapIfUnrecognized(error, "channelDeltaConnectionFailedToProcessMessage", message);
41
65
  }
42
66
  }
43
67
  reSubmit(content, localOpMetadata) {
44
- this.handler.reSubmit(content, localOpMetadata);
68
+ processWithStashedOpMetadataHandling(content, localOpMetadata, this.handler.reSubmit.bind(this.handler));
45
69
  }
46
70
  rollback(content, localOpMetadata) {
47
71
  if (this.handler.rollback === undefined) {
48
72
  throw new Error("Handler doesn't support rollback");
49
73
  }
50
- this.handler.rollback(content, localOpMetadata);
74
+ processWithStashedOpMetadataHandling(content, localOpMetadata, this.handler.rollback.bind(this.handler));
51
75
  }
52
76
  applyStashedOp(content) {
53
- return this.handler.applyStashedOp(content);
77
+ try {
78
+ this.stashedOpMd = this.isAttachedAndVisible() ? createStashedOpMetadata() : undefined;
79
+ this.handler.applyStashedOp(content);
80
+ return this.stashedOpMd;
81
+ }
82
+ finally {
83
+ this.stashedOpMd = undefined;
84
+ }
85
+ }
86
+ submit(contents, metadata) {
87
+ if (this.stashedOpMd !== undefined) {
88
+ this.stashedOpMd.push({ contents, metadata });
89
+ }
90
+ else {
91
+ this.submitFn(contents, metadata);
92
+ }
54
93
  }
55
94
  }
56
95
  exports.ChannelDeltaConnection = ChannelDeltaConnection;
@@ -1 +1 @@
1
- {"version":3,"file":"channelDeltaConnection.js","sourceRoot":"","sources":["../src/channelDeltaConnection.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,2DAAoD;AAGpD,qEAAsE;AAGtE,MAAa,sBAAsB;IAGlC,IAAY,OAAO;QAClB,IAAA,mBAAM,EAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IACD,IAAW,SAAS;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,YACS,UAAmB,EACX,MAAwD,EACxD,KAAiB;IACjC,yGAAyG;IACzF,wBAGP;QAPD,eAAU,GAAV,UAAU,CAAS;QACX,WAAM,GAAN,MAAM,CAAkD;QACxD,UAAK,GAAL,KAAK,CAAY;QAEjB,6BAAwB,GAAxB,wBAAwB,CAG/B;IACP,CAAC;IAEG,MAAM,CAAC,OAAsB;QACnC,IAAA,mBAAM,EAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACnF,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IACzB,CAAC;IAEM,kBAAkB,CAAC,SAAkB;QAC3C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAEM,OAAO,CAAC,OAAkC,EAAE,KAAc,EAAE,eAAwB;QAC1F,IAAI;YACH,sFAAsF;YACtF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;SACtD;QAAC,OAAO,KAAK,EAAE;YACf,MAAM,qCAAmB,CAAC,kBAAkB,CAC3C,KAAK,EACL,8CAA8C,EAC9C,OAAO,CACP,CAAC;SACF;IACF,CAAC;IAEM,QAAQ,CAAC,OAAY,EAAE,eAAwB;QACrD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACjD,CAAC;IAEM,QAAQ,CAAC,OAAY,EAAE,eAAwB;QACrD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;SACpD;QACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACjD,CAAC;IAEM,cAAc,CAAC,OAAY;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;CACD;AA3DD,wDA2DC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { IDeltaConnection, IDeltaHandler } from \"@fluidframework/datastore-definitions\";\nimport { DataProcessingError } from \"@fluidframework/telemetry-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\n\nexport class ChannelDeltaConnection implements IDeltaConnection {\n\tprivate _handler: IDeltaHandler | undefined;\n\n\tprivate get handler(): IDeltaHandler {\n\t\tassert(!!this._handler, 0x177 /* \"Missing delta handler\" */);\n\t\treturn this._handler;\n\t}\n\tpublic get connected(): boolean {\n\t\treturn this._connected;\n\t}\n\n\tconstructor(\n\t\tprivate _connected: boolean,\n\t\tpublic readonly submit: (content: any, localOpMetadata: unknown) => void,\n\t\tpublic readonly dirty: () => void,\n\t\t/** @deprecated There is no replacement for this, its functionality is no longer needed at this layer. */\n\t\tpublic readonly addedGCOutboundReference: (\n\t\t\tsrcHandle: IFluidHandle,\n\t\t\toutboundHandle: IFluidHandle,\n\t\t) => void,\n\t) {}\n\n\tpublic attach(handler: IDeltaHandler) {\n\t\tassert(this._handler === undefined, 0x178 /* \"Missing delta handler on attach\" */);\n\t\tthis._handler = handler;\n\t}\n\n\tpublic setConnectionState(connected: boolean) {\n\t\tthis._connected = connected;\n\t\tthis.handler.setConnectionState(connected);\n\t}\n\n\tpublic process(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\ttry {\n\t\t\t// catches as data processing error whether or not they come from async pending queues\n\t\t\tthis.handler.process(message, local, localOpMetadata);\n\t\t} catch (error) {\n\t\t\tthrow DataProcessingError.wrapIfUnrecognized(\n\t\t\t\terror,\n\t\t\t\t\"channelDeltaConnectionFailedToProcessMessage\",\n\t\t\t\tmessage,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic reSubmit(content: any, localOpMetadata: unknown) {\n\t\tthis.handler.reSubmit(content, localOpMetadata);\n\t}\n\n\tpublic rollback(content: any, localOpMetadata: unknown) {\n\t\tif (this.handler.rollback === undefined) {\n\t\t\tthrow new Error(\"Handler doesn't support rollback\");\n\t\t}\n\t\tthis.handler.rollback(content, localOpMetadata);\n\t}\n\n\tpublic applyStashedOp(content: any): unknown {\n\t\treturn this.handler.applyStashedOp(content);\n\t}\n}\n"]}
1
+ {"version":3,"file":"channelDeltaConnection.js","sourceRoot":"","sources":["../src/channelDeltaConnection.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 { assert } from \"@fluidframework/core-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { IDeltaConnection, IDeltaHandler } from \"@fluidframework/datastore-definitions\";\nimport { DataProcessingError } from \"@fluidframework/telemetry-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\n\nconst stashedOpMetadataMark = Symbol();\n\ntype StashedOpMetadata = { contents: any; metadata: unknown }[] &\n\tRecord<typeof stashedOpMetadataMark, typeof stashedOpMetadataMark>;\n\nfunction createStashedOpMetadata(): StashedOpMetadata {\n\tconst arr = [];\n\tObject.defineProperty(arr, stashedOpMetadataMark, {\n\t\tvalue: stashedOpMetadataMark,\n\t\twritable: false,\n\t\tenumerable: true,\n\t});\n\treturn arr as any as StashedOpMetadata;\n}\n\nfunction isStashedOpMetadata(md: unknown): md is StashedOpMetadata {\n\treturn (\n\t\tArray.isArray(md) &&\n\t\tstashedOpMetadataMark in md &&\n\t\tmd[stashedOpMetadataMark] === stashedOpMetadataMark\n\t);\n}\n\nfunction processWithStashedOpMetadataHandling(\n\tcontent: any,\n\tlocalOpMetaData: unknown,\n\tfunc: (contents: any, metadata: unknown) => void,\n) {\n\tif (isStashedOpMetadata(localOpMetaData)) {\n\t\tlocalOpMetaData.forEach(({ contents, metadata }) => func(contents, metadata));\n\t} else {\n\t\tfunc(content, localOpMetaData);\n\t}\n}\n\nexport class ChannelDeltaConnection implements IDeltaConnection {\n\tprivate _handler: IDeltaHandler | undefined;\n\tprivate stashedOpMd: StashedOpMetadata | undefined;\n\n\tprivate get handler(): IDeltaHandler {\n\t\tassert(!!this._handler, 0x177 /* \"Missing delta handler\" */);\n\t\treturn this._handler;\n\t}\n\tpublic get connected(): boolean {\n\t\treturn this._connected;\n\t}\n\n\tconstructor(\n\t\tprivate _connected: boolean,\n\t\tprivate readonly submitFn: (content: any, localOpMetadata: unknown) => void,\n\t\tpublic readonly dirty: () => void,\n\t\t/** @deprecated There is no replacement for this, its functionality is no longer needed at this layer. */\n\t\tpublic readonly addedGCOutboundReference: (\n\t\t\tsrcHandle: IFluidHandle,\n\t\t\toutboundHandle: IFluidHandle,\n\t\t) => void,\n\t\tprivate readonly isAttachedAndVisible: () => boolean,\n\t) {}\n\n\tpublic attach(handler: IDeltaHandler) {\n\t\tassert(this._handler === undefined, 0x178 /* \"Missing delta handler on attach\" */);\n\t\tthis._handler = handler;\n\t}\n\n\tpublic setConnectionState(connected: boolean) {\n\t\tthis._connected = connected;\n\t\tthis.handler.setConnectionState(connected);\n\t}\n\n\tpublic process(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown) {\n\t\ttry {\n\t\t\t// catches as data processing error whether or not they come from async pending queues\n\t\t\tprocessWithStashedOpMetadataHandling(\n\t\t\t\tmessage.contents,\n\t\t\t\tlocalOpMetadata,\n\t\t\t\t(contents, metadata) =>\n\t\t\t\t\tthis.handler.process({ ...message, contents }, local, metadata),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthrow DataProcessingError.wrapIfUnrecognized(\n\t\t\t\terror,\n\t\t\t\t\"channelDeltaConnectionFailedToProcessMessage\",\n\t\t\t\tmessage,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic reSubmit(content: any, localOpMetadata: unknown) {\n\t\tprocessWithStashedOpMetadataHandling(\n\t\t\tcontent,\n\t\t\tlocalOpMetadata,\n\t\t\tthis.handler.reSubmit.bind(this.handler),\n\t\t);\n\t}\n\n\tpublic rollback(content: any, localOpMetadata: unknown) {\n\t\tif (this.handler.rollback === undefined) {\n\t\t\tthrow new Error(\"Handler doesn't support rollback\");\n\t\t}\n\t\tprocessWithStashedOpMetadataHandling(\n\t\t\tcontent,\n\t\t\tlocalOpMetadata,\n\t\t\tthis.handler.rollback.bind(this.handler),\n\t\t);\n\t}\n\n\tpublic applyStashedOp(content: any): unknown {\n\t\ttry {\n\t\t\tthis.stashedOpMd = this.isAttachedAndVisible() ? createStashedOpMetadata() : undefined;\n\t\t\tthis.handler.applyStashedOp(content);\n\t\t\treturn this.stashedOpMd;\n\t\t} finally {\n\t\t\tthis.stashedOpMd = undefined;\n\t\t}\n\t}\n\n\tpublic submit(contents: any, metadata: unknown): void {\n\t\tif (this.stashedOpMd !== undefined) {\n\t\t\tthis.stashedOpMd.push({ contents, metadata });\n\t\t} else {\n\t\t\tthis.submitFn(contents, metadata);\n\t\t}\n\t}\n}\n"]}
@@ -5,10 +5,11 @@
5
5
  import { TypedEventEmitter } from "@fluid-internal/client-utils";
6
6
  import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
7
7
  import { FluidObject, IFluidHandle, IFluidHandleContext, IRequest, IResponse } from "@fluidframework/core-interfaces";
8
- import { IAudience, IDeltaManager, AttachState, ILoaderOptions } from "@fluidframework/container-definitions";
8
+ import { IAudience, IDeltaManager, AttachState } from "@fluidframework/container-definitions";
9
9
  import { IClientDetails, IDocumentMessage, ISequencedDocumentMessage, IQuorumClients } from "@fluidframework/protocol-definitions";
10
- import { IFluidDataStoreContext, IFluidDataStoreChannel, IGarbageCollectionData, IInboundSignalMessage, ISummaryTreeWithStats, VisibilityState, ITelemetryContext, IIdCompressor } from "@fluidframework/runtime-definitions";
10
+ import { IFluidDataStoreContext, IFluidDataStoreChannel, IGarbageCollectionData, IInboundSignalMessage, ISummaryTreeWithStats, VisibilityState, ITelemetryContext } from "@fluidframework/runtime-definitions";
11
11
  import { IChannel, IFluidDataStoreRuntime, IFluidDataStoreRuntimeEvents, IChannelFactory } from "@fluidframework/datastore-definitions";
12
+ import { IIdCompressor } from "@fluidframework/id-compressor";
12
13
  /**
13
14
  * @alpha
14
15
  */
@@ -56,7 +57,7 @@ export declare class FluidDataStoreRuntime extends TypedEventEmitter<IFluidDataS
56
57
  visibilityState: VisibilityState;
57
58
  private readonly pendingHandlesToMakeVisible;
58
59
  readonly id: string;
59
- readonly options: ILoaderOptions;
60
+ readonly options: Record<string | number, any>;
60
61
  readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;
61
62
  private readonly quorum;
62
63
  private readonly audience;
@@ -93,6 +94,13 @@ export declare class FluidDataStoreRuntime extends TypedEventEmitter<IFluidDataS
93
94
  resolveHandle(request: IRequest): Promise<IResponse>;
94
95
  request(request: IRequest): Promise<IResponse>;
95
96
  getChannel(id: string): Promise<IChannel>;
97
+ /**
98
+ * Validate user provided channel ID
99
+ * Channel ID has limitations. "/" is not allowed as IDs in storage can not have slashes - we parse tree paths and use "/" as separator.
100
+ * IDs cannot start with "_" as it could result in collision of IDs with auto-assigned (by FF) short IDs.
101
+ * @param id - channel ID.
102
+ */
103
+ protected validateChannelId(id: string): void;
96
104
  /**
97
105
  * Api which allows caller to create the channel first and then add it to the runtime.
98
106
  * The channel type should be present in the registry, otherwise the runtime would reject
@@ -101,7 +109,7 @@ export declare class FluidDataStoreRuntime extends TypedEventEmitter<IFluidDataS
101
109
  * @param channel - channel which needs to be added to the runtime.
102
110
  */
103
111
  addChannel(channel: IChannel): void;
104
- createChannel(id: string | undefined, type: string): IChannel;
112
+ createChannel(idArg: string | undefined, type: string): IChannel;
105
113
  private createChannelContext;
106
114
  /**
107
115
  * Binds a channel with the runtime. If the runtime is attached we will attach the channel right away.
@@ -184,6 +192,15 @@ export declare class FluidDataStoreRuntime extends TypedEventEmitter<IFluidDataS
184
192
  */
185
193
  summarize(fullTree?: boolean, trackState?: boolean, telemetryContext?: ITelemetryContext): Promise<ISummaryTreeWithStats>;
186
194
  getAttachSummary(telemetryContext?: ITelemetryContext): ISummaryTreeWithStats;
195
+ /**
196
+ * Get the GC Data for the initial state being attached so remote clients can learn of this DataStore's outbound routes
197
+ */
198
+ getAttachGCData(telemetryContext?: ITelemetryContext): IGarbageCollectionData;
199
+ /**
200
+ * Helper method for preparing to attach this dataStore.
201
+ * Runs the callback for each bound context to incorporate its data however the caller specifies
202
+ */
203
+ private visitLocalBoundContextsDuringAttach;
187
204
  submitMessage(type: DataStoreMessageType, content: any, localOpMetadata: unknown): void;
188
205
  /**
189
206
  * Submits the signal to be sent to other clients.
@@ -197,9 +214,10 @@ export declare class FluidDataStoreRuntime extends TypedEventEmitter<IFluidDataS
197
214
  */
198
215
  waitAttached(): Promise<void>;
199
216
  /**
200
- * Attach channel should only be called after the data store has been attached
217
+ * Assuming this DataStore is already attached, this will make the given channel locally visible
218
+ * by submitting its attach op.
201
219
  */
202
- private attachChannel;
220
+ private makeChannelLocallyVisible;
203
221
  private submitChannelOp;
204
222
  private submit;
205
223
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"dataStoreRuntime.d.ts","sourceRoot":"","sources":["../src/dataStoreRuntime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dataStoreRuntime.d.ts","sourceRoot":"","sources":["../src/dataStoreRuntime.ts"],"names":[],"mappings":"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"}