@fluidframework/datastore 0.56.3 → 0.57.0-51086

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 (51) hide show
  1. package/dist/channelContext.d.ts +2 -1
  2. package/dist/channelContext.d.ts.map +1 -1
  3. package/dist/channelContext.js +2 -2
  4. package/dist/channelContext.js.map +1 -1
  5. package/dist/channelStorageService.d.ts +3 -1
  6. package/dist/channelStorageService.d.ts.map +1 -1
  7. package/dist/channelStorageService.js +5 -2
  8. package/dist/channelStorageService.js.map +1 -1
  9. package/dist/dataStoreRuntime.d.ts.map +1 -1
  10. package/dist/dataStoreRuntime.js +2 -2
  11. package/dist/dataStoreRuntime.js.map +1 -1
  12. package/dist/localChannelContext.d.ts +3 -2
  13. package/dist/localChannelContext.d.ts.map +1 -1
  14. package/dist/localChannelContext.js +4 -4
  15. package/dist/localChannelContext.js.map +1 -1
  16. package/dist/packageVersion.d.ts +1 -1
  17. package/dist/packageVersion.d.ts.map +1 -1
  18. package/dist/packageVersion.js +1 -1
  19. package/dist/packageVersion.js.map +1 -1
  20. package/dist/remoteChannelContext.d.ts.map +1 -1
  21. package/dist/remoteChannelContext.js +2 -2
  22. package/dist/remoteChannelContext.js.map +1 -1
  23. package/lib/channelContext.d.ts +2 -1
  24. package/lib/channelContext.d.ts.map +1 -1
  25. package/lib/channelContext.js +2 -2
  26. package/lib/channelContext.js.map +1 -1
  27. package/lib/channelStorageService.d.ts +3 -1
  28. package/lib/channelStorageService.d.ts.map +1 -1
  29. package/lib/channelStorageService.js +5 -2
  30. package/lib/channelStorageService.js.map +1 -1
  31. package/lib/dataStoreRuntime.d.ts.map +1 -1
  32. package/lib/dataStoreRuntime.js +2 -2
  33. package/lib/dataStoreRuntime.js.map +1 -1
  34. package/lib/localChannelContext.d.ts +3 -2
  35. package/lib/localChannelContext.d.ts.map +1 -1
  36. package/lib/localChannelContext.js +4 -4
  37. package/lib/localChannelContext.js.map +1 -1
  38. package/lib/packageVersion.d.ts +1 -1
  39. package/lib/packageVersion.d.ts.map +1 -1
  40. package/lib/packageVersion.js +1 -1
  41. package/lib/packageVersion.js.map +1 -1
  42. package/lib/remoteChannelContext.d.ts.map +1 -1
  43. package/lib/remoteChannelContext.js +2 -2
  44. package/lib/remoteChannelContext.js.map +1 -1
  45. package/package.json +12 -12
  46. package/src/channelContext.ts +3 -1
  47. package/src/channelStorageService.ts +6 -1
  48. package/src/dataStoreRuntime.ts +3 -1
  49. package/src/localChannelContext.ts +5 -0
  50. package/src/packageVersion.ts +1 -1
  51. package/src/remoteChannelContext.ts +4 -2
@@ -1 +1 @@
1
- {"version":3,"file":"remoteChannelContext.js","sourceRoot":"","sources":["../src/remoteChannelContext.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport { DataCorruptionError } from \"@fluidframework/container-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport {\n IChannel,\n IChannelAttributes,\n IFluidDataStoreRuntime,\n IChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { readAndParse } from \"@fluidframework/driver-utils\";\nimport {\n ISequencedDocumentMessage,\n ISnapshotTree,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n CreateChildSummarizerNodeFn,\n IFluidDataStoreContext,\n IGarbageCollectionData,\n IGarbageCollectionDetailsBase,\n ISummarizeInternalResult,\n ISummarizeResult,\n ISummarizerNodeWithGC,\n} from \"@fluidframework/runtime-definitions\";\nimport { ChildLogger, TelemetryDataTag, ThresholdCounter } from \"@fluidframework/telemetry-utils\";\nimport {\n attributesBlobKey,\n createServiceEndpoints,\n IChannelContext,\n summarizeChannelAsync,\n} from \"./channelContext\";\nimport { ChannelDeltaConnection } from \"./channelDeltaConnection\";\nimport { ChannelStorageService } from \"./channelStorageService\";\nimport { ISharedObjectRegistry } from \"./dataStoreRuntime\";\n\nexport class RemoteChannelContext implements IChannelContext {\n private isLoaded = false;\n private pending: ISequencedDocumentMessage[] | undefined = [];\n private channelP: Promise<IChannel> | undefined;\n private channel: IChannel | undefined;\n private readonly services: {\n readonly deltaConnection: ChannelDeltaConnection,\n readonly objectStorage: ChannelStorageService,\n };\n private readonly summarizerNode: ISummarizerNodeWithGC;\n private readonly subLogger: ITelemetryLogger;\n private readonly thresholdOpsCounter: ThresholdCounter;\n private static readonly pendingOpsCountThreshold = 1000;\n\n constructor(\n private readonly runtime: IFluidDataStoreRuntime,\n private readonly dataStoreContext: IFluidDataStoreContext,\n storageService: IDocumentStorageService,\n submitFn: (content: any, localOpMetadata: unknown) => void,\n dirtyFn: (address: string) => void,\n addedGCOutboundReferenceFn: (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) => void,\n private readonly id: string,\n baseSnapshot: ISnapshotTree,\n private readonly registry: ISharedObjectRegistry,\n extraBlobs: Map<string, ArrayBufferLike> | undefined,\n createSummarizerNode: CreateChildSummarizerNodeFn,\n getBaseGCDetails: () => Promise<IGarbageCollectionDetailsBase>,\n private readonly attachMessageType?: string,\n ) {\n this.services = createServiceEndpoints(\n this.id,\n this.dataStoreContext.connected,\n submitFn,\n () => dirtyFn(this.id),\n addedGCOutboundReferenceFn,\n storageService,\n baseSnapshot,\n extraBlobs);\n\n const thisSummarizeInternal =\n async (fullTree: boolean, trackState: boolean) => this.summarizeInternal(fullTree, trackState);\n\n this.summarizerNode = createSummarizerNode(\n thisSummarizeInternal,\n async (fullGC?: boolean) => this.getGCDataInternal(fullGC),\n async () => getBaseGCDetails(),\n );\n\n this.subLogger = ChildLogger.create(this.runtime.logger, \"RemoteChannelContext\");\n this.thresholdOpsCounter = new ThresholdCounter(\n RemoteChannelContext.pendingOpsCountThreshold,\n this.subLogger,\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n public getChannel(): Promise<IChannel> {\n if (this.channelP === undefined) {\n this.channelP = this.loadChannel();\n }\n\n return this.channelP;\n }\n\n public setConnectionState(connected: boolean, clientId?: string) {\n // Connection events are ignored if the data store is not yet loaded\n if (!this.isLoaded) {\n return;\n }\n\n this.services.deltaConnection.setConnectionState(connected);\n }\n\n public applyStashedOp(message: ISequencedDocumentMessage): unknown {\n assert(this.isLoaded, 0x194 /* \"Remote channel must be loaded when rebasing op\" */);\n return this.services.deltaConnection.applyStashedOp(message);\n }\n\n public processOp(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown): void {\n this.summarizerNode.invalidate(message.sequenceNumber);\n\n if (this.isLoaded) {\n this.services.deltaConnection.process(message, local, localOpMetadata);\n } else {\n assert(!local, 0x195 /* \"Remote channel must not be local when processing op\" */);\n assert(this.pending !== undefined, 0x23e /* \"pending is undefined\" */);\n this.pending.push(message);\n this.thresholdOpsCounter.sendIfMultiple(\"StorePendingOps\", this.pending.length);\n }\n }\n\n public reSubmit(content: any, localOpMetadata: unknown) {\n assert(this.isLoaded, 0x196 /* \"Remote channel must be loaded when resubmitting op\" */);\n\n this.services.deltaConnection.reSubmit(content, localOpMetadata);\n }\n\n /**\n * Returns a summary at the current sequence number.\n * @param fullTree - true to bypass optimizations and force a full summary tree\n * @param trackState - This tells whether we should track state from this summary.\n */\n public async summarize(fullTree: boolean = false, trackState: boolean = true): Promise<ISummarizeResult> {\n return this.summarizerNode.summarize(fullTree, trackState);\n }\n\n private async summarizeInternal(fullTree: boolean, trackState: boolean): Promise<ISummarizeInternalResult> {\n const channel = await this.getChannel();\n const summarizeResult = await summarizeChannelAsync(channel, fullTree, trackState);\n return { ...summarizeResult, id: this.id };\n }\n\n private async loadChannel(): Promise<IChannel> {\n assert(!this.isLoaded, 0x197 /* \"Remote channel must not already be loaded when loading\" */);\n\n let attributes: IChannelAttributes | undefined;\n if (await this.services.objectStorage.contains(attributesBlobKey)) {\n attributes = await readAndParse<IChannelAttributes | undefined>(\n this.services.objectStorage,\n attributesBlobKey);\n }\n\n let factory: IChannelFactory | undefined;\n // this is a backward compatibility case where\n // the attach message doesn't include\n // the attributes. Since old attach messages\n // will not have attributes we need to keep\n // this as long as we support old attach messages\n if (attributes === undefined) {\n if (this.attachMessageType === undefined) {\n // TODO: dataStoreId may require a different tag from PackageData #7488\n throw new DataCorruptionError(\"channelTypeNotAvailable\", {\n channelId: this.id,\n dataStoreId: {\n value: this.dataStoreContext.id,\n tag: TelemetryDataTag.PackageData,\n },\n dataStorePackagePath: this.dataStoreContext.packagePath.join(\"/\"),\n });\n }\n factory = this.registry.get(this.attachMessageType);\n if (factory === undefined) {\n // TODO: dataStoreId may require a different tag from PackageData #7488\n throw new DataCorruptionError(\"channelFactoryNotRegisteredForAttachMessageType\", {\n channelId: this.id,\n dataStoreId: {\n value: this.dataStoreContext.id,\n tag: TelemetryDataTag.PackageData,\n },\n dataStorePackagePath: this.dataStoreContext.packagePath.join(\"/\"),\n channelFactoryType: this.attachMessageType,\n });\n }\n attributes = factory.attributes;\n } else {\n factory = this.registry.get(attributes.type);\n if (factory === undefined) {\n // TODO: dataStoreId may require a different tag from PackageData #7488\n throw new DataCorruptionError(\"channelFactoryNotRegisteredForGivenType\", {\n channelId: this.id,\n dataStoreId: {\n value: this.dataStoreContext.id,\n tag: TelemetryDataTag.PackageData,\n },\n dataStorePackagePath: this.dataStoreContext.packagePath.join(\"/\"),\n channelFactoryType: attributes.type,\n });\n }\n }\n\n // Compare snapshot version to collaborative object version\n if (attributes.snapshotFormatVersion !== undefined\n && attributes.snapshotFormatVersion !== factory.attributes.snapshotFormatVersion) {\n this.subLogger.sendTelemetryEvent(\n {\n eventName: \"ChannelAttributesVersionMismatch\",\n channelType: {value: attributes.type, tag: TelemetryDataTag.PackageData},\n channelSnapshotVersion: {\n value: `${attributes.snapshotFormatVersion}@${attributes.packageVersion}`,\n tag: TelemetryDataTag.PackageData,\n },\n channelCodeVersion: {\n value: `${factory.attributes.snapshotFormatVersion}@${factory.attributes.packageVersion}`,\n tag: TelemetryDataTag.PackageData,\n },\n },\n );\n }\n\n const channel = await factory.load(\n this.runtime,\n this.id,\n this.services,\n attributes);\n\n // Send all pending messages to the channel\n assert(this.pending !== undefined, 0x23f /* \"pending undefined\" */);\n for (const message of this.pending) {\n this.services.deltaConnection.process(message, false, undefined /* localOpMetadata */);\n }\n this.thresholdOpsCounter.send(\"ProcessPendingOps\", this.pending.length);\n\n // Commit changes.\n this.channel = channel;\n this.pending = undefined;\n this.isLoaded = true;\n\n // Because have some await between we created the service and here, the connection state might have changed\n // and we don't propagate the connection state when we are not loaded. So we have to set it again here.\n this.services.deltaConnection.setConnectionState(this.dataStoreContext.connected);\n return this.channel;\n }\n\n /**\n * Returns the data used for garbage collection. This includes a list of GC nodes that represent this context.\n * Each node has a set of outbound routes to other GC nodes in the document.\n * If there is no new data in this context since the last summary, previous GC data is used.\n * If there is new data, the GC data is generated again (by calling getGCDataInternal).\n * @param fullGC - true to bypass optimizations and force full generation of GC data.\n */\n public async getGCData(fullGC: boolean = false): Promise<IGarbageCollectionData> {\n return this.summarizerNode.getGCData(fullGC);\n }\n\n /**\n * Generates the data used for garbage collection. This is called when there is new data since last summary. It\n * loads the context and calls into the channel to get its GC data.\n * @param fullGC - true to bypass optimizations and force full generation of GC data.\n */\n private async getGCDataInternal(fullGC: boolean = false): Promise<IGarbageCollectionData> {\n const channel = await this.getChannel();\n return channel.getGCData(fullGC);\n }\n\n public updateUsedRoutes(usedRoutes: string[], gcTimestamp?: number) {\n /**\n * Currently, DDSs are always considered referenced and are not garbage collected. Update the summarizer node's\n * used routes to contain a route to this channel context.\n * Once we have GC at DDS level, this will be updated to use the passed usedRoutes. See -\n * https://github.com/microsoft/FluidFramework/issues/4611\n */\n this.summarizerNode.updateUsedRoutes([\"\"]);\n }\n}\n"]}
1
+ {"version":3,"file":"remoteChannelContext.js","sourceRoot":"","sources":["../src/remoteChannelContext.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport { DataCorruptionError } from \"@fluidframework/container-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport {\n IChannel,\n IChannelAttributes,\n IFluidDataStoreRuntime,\n IChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { readAndParse } from \"@fluidframework/driver-utils\";\nimport {\n ISequencedDocumentMessage,\n ISnapshotTree,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n CreateChildSummarizerNodeFn,\n IFluidDataStoreContext,\n IGarbageCollectionData,\n IGarbageCollectionDetailsBase,\n ISummarizeInternalResult,\n ISummarizeResult,\n ISummarizerNodeWithGC,\n} from \"@fluidframework/runtime-definitions\";\nimport { ChildLogger, TelemetryDataTag, ThresholdCounter } from \"@fluidframework/telemetry-utils\";\nimport {\n attributesBlobKey,\n createServiceEndpoints,\n IChannelContext,\n summarizeChannelAsync,\n} from \"./channelContext\";\nimport { ChannelDeltaConnection } from \"./channelDeltaConnection\";\nimport { ChannelStorageService } from \"./channelStorageService\";\nimport { ISharedObjectRegistry } from \"./dataStoreRuntime\";\n\nexport class RemoteChannelContext implements IChannelContext {\n private isLoaded = false;\n private pending: ISequencedDocumentMessage[] | undefined = [];\n private channelP: Promise<IChannel> | undefined;\n private channel: IChannel | undefined;\n private readonly services: {\n readonly deltaConnection: ChannelDeltaConnection,\n readonly objectStorage: ChannelStorageService,\n };\n private readonly summarizerNode: ISummarizerNodeWithGC;\n private readonly subLogger: ITelemetryLogger;\n private readonly thresholdOpsCounter: ThresholdCounter;\n private static readonly pendingOpsCountThreshold = 1000;\n\n constructor(\n private readonly runtime: IFluidDataStoreRuntime,\n private readonly dataStoreContext: IFluidDataStoreContext,\n storageService: IDocumentStorageService,\n submitFn: (content: any, localOpMetadata: unknown) => void,\n dirtyFn: (address: string) => void,\n addedGCOutboundReferenceFn: (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) => void,\n private readonly id: string,\n baseSnapshot: ISnapshotTree,\n private readonly registry: ISharedObjectRegistry,\n extraBlobs: Map<string, ArrayBufferLike> | undefined,\n createSummarizerNode: CreateChildSummarizerNodeFn,\n getBaseGCDetails: () => Promise<IGarbageCollectionDetailsBase>,\n private readonly attachMessageType?: string,\n ) {\n this.subLogger = ChildLogger.create(this.runtime.logger, \"RemoteChannelContext\");\n\n this.services = createServiceEndpoints(\n this.id,\n this.dataStoreContext.connected,\n submitFn,\n () => dirtyFn(this.id),\n addedGCOutboundReferenceFn,\n storageService,\n this.subLogger,\n baseSnapshot,\n extraBlobs);\n\n const thisSummarizeInternal =\n async (fullTree: boolean, trackState: boolean) => this.summarizeInternal(fullTree, trackState);\n\n this.summarizerNode = createSummarizerNode(\n thisSummarizeInternal,\n async (fullGC?: boolean) => this.getGCDataInternal(fullGC),\n async () => getBaseGCDetails(),\n );\n\n this.thresholdOpsCounter = new ThresholdCounter(\n RemoteChannelContext.pendingOpsCountThreshold,\n this.subLogger,\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n public getChannel(): Promise<IChannel> {\n if (this.channelP === undefined) {\n this.channelP = this.loadChannel();\n }\n\n return this.channelP;\n }\n\n public setConnectionState(connected: boolean, clientId?: string) {\n // Connection events are ignored if the data store is not yet loaded\n if (!this.isLoaded) {\n return;\n }\n\n this.services.deltaConnection.setConnectionState(connected);\n }\n\n public applyStashedOp(message: ISequencedDocumentMessage): unknown {\n assert(this.isLoaded, 0x194 /* \"Remote channel must be loaded when rebasing op\" */);\n return this.services.deltaConnection.applyStashedOp(message);\n }\n\n public processOp(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown): void {\n this.summarizerNode.invalidate(message.sequenceNumber);\n\n if (this.isLoaded) {\n this.services.deltaConnection.process(message, local, localOpMetadata);\n } else {\n assert(!local, 0x195 /* \"Remote channel must not be local when processing op\" */);\n assert(this.pending !== undefined, 0x23e /* \"pending is undefined\" */);\n this.pending.push(message);\n this.thresholdOpsCounter.sendIfMultiple(\"StorePendingOps\", this.pending.length);\n }\n }\n\n public reSubmit(content: any, localOpMetadata: unknown) {\n assert(this.isLoaded, 0x196 /* \"Remote channel must be loaded when resubmitting op\" */);\n\n this.services.deltaConnection.reSubmit(content, localOpMetadata);\n }\n\n /**\n * Returns a summary at the current sequence number.\n * @param fullTree - true to bypass optimizations and force a full summary tree\n * @param trackState - This tells whether we should track state from this summary.\n */\n public async summarize(fullTree: boolean = false, trackState: boolean = true): Promise<ISummarizeResult> {\n return this.summarizerNode.summarize(fullTree, trackState);\n }\n\n private async summarizeInternal(fullTree: boolean, trackState: boolean): Promise<ISummarizeInternalResult> {\n const channel = await this.getChannel();\n const summarizeResult = await summarizeChannelAsync(channel, fullTree, trackState);\n return { ...summarizeResult, id: this.id };\n }\n\n private async loadChannel(): Promise<IChannel> {\n assert(!this.isLoaded, 0x197 /* \"Remote channel must not already be loaded when loading\" */);\n\n let attributes: IChannelAttributes | undefined;\n if (await this.services.objectStorage.contains(attributesBlobKey)) {\n attributes = await readAndParse<IChannelAttributes | undefined>(\n this.services.objectStorage,\n attributesBlobKey);\n }\n\n let factory: IChannelFactory | undefined;\n // this is a backward compatibility case where\n // the attach message doesn't include\n // the attributes. Since old attach messages\n // will not have attributes we need to keep\n // this as long as we support old attach messages\n if (attributes === undefined) {\n if (this.attachMessageType === undefined) {\n // TODO: dataStoreId may require a different tag from PackageData #7488\n throw new DataCorruptionError(\"channelTypeNotAvailable\", {\n channelId: this.id,\n dataStoreId: {\n value: this.dataStoreContext.id,\n tag: TelemetryDataTag.PackageData,\n },\n dataStorePackagePath: this.dataStoreContext.packagePath.join(\"/\"),\n });\n }\n factory = this.registry.get(this.attachMessageType);\n if (factory === undefined) {\n // TODO: dataStoreId may require a different tag from PackageData #7488\n throw new DataCorruptionError(\"channelFactoryNotRegisteredForAttachMessageType\", {\n channelId: this.id,\n dataStoreId: {\n value: this.dataStoreContext.id,\n tag: TelemetryDataTag.PackageData,\n },\n dataStorePackagePath: this.dataStoreContext.packagePath.join(\"/\"),\n channelFactoryType: this.attachMessageType,\n });\n }\n attributes = factory.attributes;\n } else {\n factory = this.registry.get(attributes.type);\n if (factory === undefined) {\n // TODO: dataStoreId may require a different tag from PackageData #7488\n throw new DataCorruptionError(\"channelFactoryNotRegisteredForGivenType\", {\n channelId: this.id,\n dataStoreId: {\n value: this.dataStoreContext.id,\n tag: TelemetryDataTag.PackageData,\n },\n dataStorePackagePath: this.dataStoreContext.packagePath.join(\"/\"),\n channelFactoryType: attributes.type,\n });\n }\n }\n\n // Compare snapshot version to collaborative object version\n if (attributes.snapshotFormatVersion !== undefined\n && attributes.snapshotFormatVersion !== factory.attributes.snapshotFormatVersion) {\n this.subLogger.sendTelemetryEvent(\n {\n eventName: \"ChannelAttributesVersionMismatch\",\n channelType: {value: attributes.type, tag: TelemetryDataTag.PackageData},\n channelSnapshotVersion: {\n value: `${attributes.snapshotFormatVersion}@${attributes.packageVersion}`,\n tag: TelemetryDataTag.PackageData,\n },\n channelCodeVersion: {\n value: `${factory.attributes.snapshotFormatVersion}@${factory.attributes.packageVersion}`,\n tag: TelemetryDataTag.PackageData,\n },\n },\n );\n }\n\n const channel = await factory.load(\n this.runtime,\n this.id,\n this.services,\n attributes);\n\n // Send all pending messages to the channel\n assert(this.pending !== undefined, 0x23f /* \"pending undefined\" */);\n for (const message of this.pending) {\n this.services.deltaConnection.process(message, false, undefined /* localOpMetadata */);\n }\n this.thresholdOpsCounter.send(\"ProcessPendingOps\", this.pending.length);\n\n // Commit changes.\n this.channel = channel;\n this.pending = undefined;\n this.isLoaded = true;\n\n // Because have some await between we created the service and here, the connection state might have changed\n // and we don't propagate the connection state when we are not loaded. So we have to set it again here.\n this.services.deltaConnection.setConnectionState(this.dataStoreContext.connected);\n return this.channel;\n }\n\n /**\n * Returns the data used for garbage collection. This includes a list of GC nodes that represent this context.\n * Each node has a set of outbound routes to other GC nodes in the document.\n * If there is no new data in this context since the last summary, previous GC data is used.\n * If there is new data, the GC data is generated again (by calling getGCDataInternal).\n * @param fullGC - true to bypass optimizations and force full generation of GC data.\n */\n public async getGCData(fullGC: boolean = false): Promise<IGarbageCollectionData> {\n return this.summarizerNode.getGCData(fullGC);\n }\n\n /**\n * Generates the data used for garbage collection. This is called when there is new data since last summary. It\n * loads the context and calls into the channel to get its GC data.\n * @param fullGC - true to bypass optimizations and force full generation of GC data.\n */\n private async getGCDataInternal(fullGC: boolean = false): Promise<IGarbageCollectionData> {\n const channel = await this.getChannel();\n return channel.getGCData(fullGC);\n }\n\n public updateUsedRoutes(usedRoutes: string[], gcTimestamp?: number) {\n /**\n * Currently, DDSs are always considered referenced and are not garbage collected. Update the summarizer node's\n * used routes to contain a route to this channel context.\n * Once we have GC at DDS level, this will be updated to use the passed usedRoutes. See -\n * https://github.com/microsoft/FluidFramework/issues/4611\n */\n this.summarizerNode.updateUsedRoutes([\"\"]);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/datastore",
3
- "version": "0.56.3",
3
+ "version": "0.57.0-51086",
4
4
  "description": "Fluid data store implementation",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": "https://github.com/microsoft/FluidFramework",
@@ -58,26 +58,26 @@
58
58
  "dependencies": {
59
59
  "@fluidframework/common-definitions": "^0.20.1",
60
60
  "@fluidframework/common-utils": "^0.32.1",
61
- "@fluidframework/container-definitions": "^0.45.0",
62
- "@fluidframework/container-utils": "^0.56.3",
61
+ "@fluidframework/container-definitions": "^0.46.0-0",
62
+ "@fluidframework/container-utils": "0.57.0-51086",
63
63
  "@fluidframework/core-interfaces": "^0.42.0",
64
- "@fluidframework/datastore-definitions": "^0.56.3",
64
+ "@fluidframework/datastore-definitions": "0.57.0-51086",
65
65
  "@fluidframework/driver-definitions": "^0.44.0",
66
- "@fluidframework/driver-utils": "^0.56.3",
67
- "@fluidframework/garbage-collector": "^0.56.3",
66
+ "@fluidframework/driver-utils": "0.57.0-51086",
67
+ "@fluidframework/garbage-collector": "0.57.0-51086",
68
68
  "@fluidframework/protocol-base": "^0.1034.0",
69
69
  "@fluidframework/protocol-definitions": "^0.1026.0",
70
- "@fluidframework/runtime-definitions": "^0.56.3",
71
- "@fluidframework/runtime-utils": "^0.56.3",
72
- "@fluidframework/telemetry-utils": "^0.56.3",
70
+ "@fluidframework/runtime-definitions": "0.57.0-51086",
71
+ "@fluidframework/runtime-utils": "0.57.0-51086",
72
+ "@fluidframework/telemetry-utils": "0.57.0-51086",
73
73
  "lodash": "^4.17.21",
74
74
  "uuid": "^8.3.1"
75
75
  },
76
76
  "devDependencies": {
77
77
  "@fluidframework/build-common": "^0.23.0",
78
- "@fluidframework/eslint-config-fluid": "^0.25.0",
79
- "@fluidframework/mocha-test-setup": "^0.56.3",
80
- "@fluidframework/test-runtime-utils": "^0.56.3",
78
+ "@fluidframework/eslint-config-fluid": "^0.26.0-0",
79
+ "@fluidframework/mocha-test-setup": "0.57.0-51086",
80
+ "@fluidframework/test-runtime-utils": "0.57.0-51086",
81
81
  "@microsoft/api-extractor": "^7.16.1",
82
82
  "@rushstack/eslint-config": "^2.5.1",
83
83
  "@types/mocha": "^8.2.2",
@@ -3,6 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import { ITelemetryLogger } from "@fluidframework/common-definitions";
6
7
  import { IFluidHandle } from "@fluidframework/core-interfaces";
7
8
  import { IChannel } from "@fluidframework/datastore-definitions";
8
9
  import { IDocumentStorageService } from "@fluidframework/driver-definitions";
@@ -55,6 +56,7 @@ export function createServiceEndpoints(
55
56
  dirtyFn: () => void,
56
57
  addedGCOutboundReferenceFn: (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) => void,
57
58
  storageService: IDocumentStorageService,
59
+ logger: ITelemetryLogger,
58
60
  tree?: ISnapshotTree,
59
61
  extraBlobs?: Map<string, ArrayBufferLike>,
60
62
  ) {
@@ -64,7 +66,7 @@ export function createServiceEndpoints(
64
66
  (message, localOpMetadata) => submitFn(message, localOpMetadata),
65
67
  dirtyFn,
66
68
  addedGCOutboundReferenceFn);
67
- const objectStorage = new ChannelStorageService(tree, storageService, extraBlobs);
69
+ const objectStorage = new ChannelStorageService(tree, storageService, logger, extraBlobs);
68
70
 
69
71
  return {
70
72
  deltaConnection,
@@ -7,6 +7,7 @@ import { IDocumentStorageService } from "@fluidframework/driver-definitions";
7
7
  import { ISnapshotTree } from "@fluidframework/protocol-definitions";
8
8
  import { IChannelStorageService } from "@fluidframework/datastore-definitions";
9
9
  import { getNormalizedObjectStoragePathParts } from "@fluidframework/runtime-utils";
10
+ import { ITelemetryLogger } from "@fluidframework/common-definitions";
10
11
 
11
12
  export class ChannelStorageService implements IChannelStorageService {
12
13
  private static flattenTree(base: string, tree: ISnapshotTree, results: { [path: string]: string }) {
@@ -26,6 +27,7 @@ export class ChannelStorageService implements IChannelStorageService {
26
27
  constructor(
27
28
  private readonly tree: ISnapshotTree | undefined,
28
29
  private readonly storage: Pick<IDocumentStorageService, "readBlob">,
30
+ private readonly logger: ITelemetryLogger,
29
31
  private readonly extraBlobs?: Map<string, ArrayBufferLike>,
30
32
  ) {
31
33
  this.flattenedTree = {};
@@ -48,7 +50,10 @@ export class ChannelStorageService implements IChannelStorageService {
48
50
  if (blob !== undefined) {
49
51
  return blob;
50
52
  }
51
- return this.storage.readBlob(id);
53
+ const blobP = this.storage.readBlob(id);
54
+ blobP.catch((error) => this.logger.sendErrorEvent({ eventName: "ChannelStorageBlobError"}, error));
55
+
56
+ return blobP;
52
57
  }
53
58
 
54
59
  public async list(path: string): Promise<string[]> {
@@ -217,6 +217,7 @@ IFluidDataStoreChannel, IFluidDataStoreRuntime, IFluidHandleContext {
217
217
  this,
218
218
  this.dataStoreContext,
219
219
  this.dataStoreContext.storage,
220
+ this.logger,
220
221
  (content, localOpMetadata) => this.submitChannelOp(path, content, localOpMetadata),
221
222
  (address: string) => this.setChannelDirty(address),
222
223
  (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>
@@ -343,6 +344,7 @@ IFluidDataStoreChannel, IFluidDataStoreRuntime, IFluidHandleContext {
343
344
  this,
344
345
  this.dataStoreContext,
345
346
  this.dataStoreContext.storage,
347
+ this.logger,
346
348
  (content, localOpMetadata) => this.submitChannelOp(id, content, localOpMetadata),
347
349
  (address: string) => this.setChannelDirty(address),
348
350
  (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) =>
@@ -882,7 +884,7 @@ export const mixinRequestHandler = (
882
884
  Base: typeof FluidDataStoreRuntime = FluidDataStoreRuntime,
883
885
  ) => class RuntimeWithRequestHandler extends Base {
884
886
  public async request(request: IRequest) {
885
- const response = await super.request(request);
887
+ const response = await super.request(request);
886
888
  if (response.status === 404) {
887
889
  return requestHandler(request, this);
888
890
  }
@@ -5,6 +5,7 @@
5
5
 
6
6
  // eslint-disable-next-line import/no-internal-modules
7
7
  import cloneDeep from "lodash/cloneDeep";
8
+ import { ITelemetryLogger } from "@fluidframework/common-definitions";
8
9
  import { IDocumentStorageService } from "@fluidframework/driver-definitions";
9
10
  import { ISequencedDocumentMessage, ISnapshotTree } from "@fluidframework/protocol-definitions";
10
11
  import {
@@ -153,6 +154,7 @@ export class RehydratedLocalChannelContext extends LocalChannelContextBase {
153
154
  runtime: IFluidDataStoreRuntime,
154
155
  dataStoreContext: IFluidDataStoreContext,
155
156
  storageService: IDocumentStorageService,
157
+ logger: ITelemetryLogger,
156
158
  submitFn: (content: any, localOpMetadata: unknown) => void,
157
159
  dirtyFn: (address: string) => void,
158
160
  addedGCOutboundReferenceFn: (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) => void,
@@ -176,6 +178,7 @@ export class RehydratedLocalChannelContext extends LocalChannelContextBase {
176
178
  this.dirtyFn,
177
179
  addedGCOutboundReferenceFn,
178
180
  storageService,
181
+ logger,
179
182
  clonedSnapshotTree,
180
183
  blobMap,
181
184
  );
@@ -269,6 +272,7 @@ export class LocalChannelContext extends LocalChannelContextBase {
269
272
  runtime: IFluidDataStoreRuntime,
270
273
  dataStoreContext: IFluidDataStoreContext,
271
274
  storageService: IDocumentStorageService,
275
+ logger: ITelemetryLogger,
272
276
  submitFn: (content: any, localOpMetadata: unknown) => void,
273
277
  dirtyFn: (address: string) => void,
274
278
  addedGCOutboundReferenceFn: (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) => void,
@@ -288,6 +292,7 @@ export class LocalChannelContext extends LocalChannelContextBase {
288
292
  this.dirtyFn,
289
293
  addedGCOutboundReferenceFn,
290
294
  storageService,
295
+ logger,
291
296
  );
292
297
  });
293
298
  this.dirtyFn = () => { dirtyFn(id); };
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/datastore";
9
- export const pkgVersion = "0.56.3";
9
+ export const pkgVersion = "0.57.0-51086";
@@ -61,13 +61,15 @@ export class RemoteChannelContext implements IChannelContext {
61
61
  dirtyFn: (address: string) => void,
62
62
  addedGCOutboundReferenceFn: (srcHandle: IFluidHandle, outboundHandle: IFluidHandle) => void,
63
63
  private readonly id: string,
64
- baseSnapshot: ISnapshotTree,
64
+ baseSnapshot: ISnapshotTree,
65
65
  private readonly registry: ISharedObjectRegistry,
66
66
  extraBlobs: Map<string, ArrayBufferLike> | undefined,
67
67
  createSummarizerNode: CreateChildSummarizerNodeFn,
68
68
  getBaseGCDetails: () => Promise<IGarbageCollectionDetailsBase>,
69
69
  private readonly attachMessageType?: string,
70
70
  ) {
71
+ this.subLogger = ChildLogger.create(this.runtime.logger, "RemoteChannelContext");
72
+
71
73
  this.services = createServiceEndpoints(
72
74
  this.id,
73
75
  this.dataStoreContext.connected,
@@ -75,6 +77,7 @@ export class RemoteChannelContext implements IChannelContext {
75
77
  () => dirtyFn(this.id),
76
78
  addedGCOutboundReferenceFn,
77
79
  storageService,
80
+ this.subLogger,
78
81
  baseSnapshot,
79
82
  extraBlobs);
80
83
 
@@ -87,7 +90,6 @@ export class RemoteChannelContext implements IChannelContext {
87
90
  async () => getBaseGCDetails(),
88
91
  );
89
92
 
90
- this.subLogger = ChildLogger.create(this.runtime.logger, "RemoteChannelContext");
91
93
  this.thresholdOpsCounter = new ThresholdCounter(
92
94
  RemoteChannelContext.pendingOpsCountThreshold,
93
95
  this.subLogger,