@fluidframework/container-loader 2.0.0-internal.5.4.2 → 2.0.0-internal.6.0.1

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 (100) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/dist/connectionManager.d.ts +1 -1
  3. package/dist/connectionManager.d.ts.map +1 -1
  4. package/dist/connectionManager.js +24 -25
  5. package/dist/connectionManager.js.map +1 -1
  6. package/dist/connectionStateHandler.d.ts +2 -1
  7. package/dist/connectionStateHandler.d.ts.map +1 -1
  8. package/dist/connectionStateHandler.js +9 -16
  9. package/dist/connectionStateHandler.js.map +1 -1
  10. package/dist/container.d.ts +10 -5
  11. package/dist/container.d.ts.map +1 -1
  12. package/dist/container.js +161 -99
  13. package/dist/container.js.map +1 -1
  14. package/dist/containerContext.d.ts +2 -7
  15. package/dist/containerContext.d.ts.map +1 -1
  16. package/dist/containerContext.js +2 -14
  17. package/dist/containerContext.js.map +1 -1
  18. package/dist/containerStorageAdapter.js +3 -5
  19. package/dist/containerStorageAdapter.js.map +1 -1
  20. package/dist/contracts.d.ts +11 -2
  21. package/dist/contracts.d.ts.map +1 -1
  22. package/dist/contracts.js +3 -3
  23. package/dist/contracts.js.map +1 -1
  24. package/dist/debugLogger.js +2 -3
  25. package/dist/debugLogger.js.map +1 -1
  26. package/dist/deltaManager.d.ts +16 -3
  27. package/dist/deltaManager.d.ts.map +1 -1
  28. package/dist/deltaManager.js +62 -24
  29. package/dist/deltaManager.js.map +1 -1
  30. package/dist/deltaQueue.js +1 -2
  31. package/dist/deltaQueue.js.map +1 -1
  32. package/dist/loader.d.ts +12 -0
  33. package/dist/loader.d.ts.map +1 -1
  34. package/dist/loader.js +57 -42
  35. package/dist/loader.js.map +1 -1
  36. package/dist/packageVersion.d.ts +1 -1
  37. package/dist/packageVersion.js +1 -1
  38. package/dist/packageVersion.js.map +1 -1
  39. package/dist/protocol.d.ts.map +1 -1
  40. package/dist/protocol.js +2 -3
  41. package/dist/protocol.js.map +1 -1
  42. package/dist/utils.d.ts +8 -1
  43. package/dist/utils.d.ts.map +1 -1
  44. package/dist/utils.js +24 -6
  45. package/dist/utils.js.map +1 -1
  46. package/lib/connectionManager.d.ts +1 -1
  47. package/lib/connectionManager.d.ts.map +1 -1
  48. package/lib/connectionManager.js +25 -26
  49. package/lib/connectionManager.js.map +1 -1
  50. package/lib/connectionStateHandler.d.ts +2 -1
  51. package/lib/connectionStateHandler.d.ts.map +1 -1
  52. package/lib/connectionStateHandler.js +9 -16
  53. package/lib/connectionStateHandler.js.map +1 -1
  54. package/lib/container.d.ts +10 -5
  55. package/lib/container.d.ts.map +1 -1
  56. package/lib/container.js +160 -98
  57. package/lib/container.js.map +1 -1
  58. package/lib/containerContext.d.ts +2 -7
  59. package/lib/containerContext.d.ts.map +1 -1
  60. package/lib/containerContext.js +2 -14
  61. package/lib/containerContext.js.map +1 -1
  62. package/lib/containerStorageAdapter.js +3 -5
  63. package/lib/containerStorageAdapter.js.map +1 -1
  64. package/lib/contracts.d.ts +11 -2
  65. package/lib/contracts.d.ts.map +1 -1
  66. package/lib/contracts.js +3 -3
  67. package/lib/contracts.js.map +1 -1
  68. package/lib/debugLogger.js +2 -3
  69. package/lib/debugLogger.js.map +1 -1
  70. package/lib/deltaManager.d.ts +16 -3
  71. package/lib/deltaManager.d.ts.map +1 -1
  72. package/lib/deltaManager.js +62 -24
  73. package/lib/deltaManager.js.map +1 -1
  74. package/lib/deltaQueue.js +1 -2
  75. package/lib/deltaQueue.js.map +1 -1
  76. package/lib/loader.d.ts +12 -0
  77. package/lib/loader.d.ts.map +1 -1
  78. package/lib/loader.js +57 -42
  79. package/lib/loader.js.map +1 -1
  80. package/lib/packageVersion.d.ts +1 -1
  81. package/lib/packageVersion.js +1 -1
  82. package/lib/packageVersion.js.map +1 -1
  83. package/lib/protocol.d.ts.map +1 -1
  84. package/lib/protocol.js +2 -3
  85. package/lib/protocol.js.map +1 -1
  86. package/lib/utils.d.ts +8 -1
  87. package/lib/utils.d.ts.map +1 -1
  88. package/lib/utils.js +22 -5
  89. package/lib/utils.js.map +1 -1
  90. package/package.json +14 -14
  91. package/src/connectionManager.ts +7 -3
  92. package/src/connectionStateHandler.ts +3 -2
  93. package/src/container.ts +113 -27
  94. package/src/containerContext.ts +0 -16
  95. package/src/contracts.ts +16 -5
  96. package/src/deltaManager.ts +22 -5
  97. package/src/loader.ts +37 -23
  98. package/src/packageVersion.ts +1 -1
  99. package/src/protocol.ts +0 -1
  100. package/src/utils.ts +29 -0
package/src/loader.ts CHANGED
@@ -37,7 +37,7 @@ import {
37
37
  IResolvedUrl,
38
38
  IUrlResolver,
39
39
  } from "@fluidframework/driver-definitions";
40
- import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
40
+ import { UsageError } from "@fluidframework/container-utils";
41
41
  import { Container, IPendingContainerState } from "./container";
42
42
  import { IParsedUrl, parseUrl } from "./utils";
43
43
  import { pkgVersion } from "./packageVersion";
@@ -45,11 +45,7 @@ import { ProtocolHandlerBuilder } from "./protocol";
45
45
  import { DebugLogger } from "./debugLogger";
46
46
 
47
47
  function canUseCache(request: IRequest): boolean {
48
- if (request.headers === undefined) {
49
- return true;
50
- }
51
-
52
- return request.headers[LoaderHeader.cache] !== false;
48
+ return request.headers?.[LoaderHeader.cache] === true;
53
49
  }
54
50
 
55
51
  function ensureResolvedUrlDefined(
@@ -68,6 +64,9 @@ export class RelativeLoader implements ILoader {
68
64
  private readonly loader: ILoader | undefined,
69
65
  ) {}
70
66
 
67
+ /**
68
+ * @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the Container's IFluidRouter/request.
69
+ */
71
70
  public get IFluidRouter(): IFluidRouter {
72
71
  return this;
73
72
  }
@@ -99,6 +98,9 @@ export class RelativeLoader implements ILoader {
99
98
  return this.loader.resolve(request);
100
99
  }
101
100
 
101
+ /**
102
+ * @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the Container's IFluidRouter/request.
103
+ */
102
104
  public async request(request: IRequest): Promise<IResponse> {
103
105
  if (request.url.startsWith("/")) {
104
106
  const container = await this.resolve(request);
@@ -348,6 +350,9 @@ export class Loader implements IHostLoader {
348
350
  });
349
351
  }
350
352
 
353
+ /**
354
+ * @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the Container's IFluidRouter/request.
355
+ */
351
356
  public get IFluidRouter(): IFluidRouter {
352
357
  return this;
353
358
  }
@@ -383,6 +388,9 @@ export class Loader implements IHostLoader {
383
388
  });
384
389
  }
385
390
 
391
+ /**
392
+ * @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the Container's IFluidRouter/request.
393
+ */
386
394
  public async request(request: IRequest): Promise<IResponse> {
387
395
  return PerformanceEvent.timedExecAsync(
388
396
  this.mc.logger,
@@ -456,11 +464,29 @@ export class Loader implements IHostLoader {
456
464
  // If set in both query string and headers, use query string. Also write the value from the query string into the header either way.
457
465
  request.headers[LoaderHeader.version] =
458
466
  parsed.version ?? request.headers[LoaderHeader.version];
467
+ const cacheHeader = request.headers[LoaderHeader.cache];
459
468
  const canCache =
460
- this.cachingEnabled &&
461
- request.headers[LoaderHeader.cache] !== false &&
469
+ // Take header value if present, else use ILoaderOptions.cache value
470
+ (cacheHeader !== undefined ? cacheHeader === true : this.cachingEnabled) &&
462
471
  pendingLocalState === undefined;
463
- const fromSequenceNumber = request.headers[LoaderHeader.sequenceNumber] ?? -1;
472
+ const fromSequenceNumber = request.headers[LoaderHeader.sequenceNumber] as
473
+ | number
474
+ | undefined;
475
+ const opsBeforeReturn = request.headers[LoaderHeader.loadMode]?.opsBeforeReturn as
476
+ | string
477
+ | undefined;
478
+
479
+ if (
480
+ opsBeforeReturn === "sequenceNumber" &&
481
+ (fromSequenceNumber === undefined || fromSequenceNumber < 0)
482
+ ) {
483
+ // If opsBeforeReturn is set to "sequenceNumber", then fromSequenceNumber should be set to a non-negative integer.
484
+ throw new UsageError("sequenceNumber must be set to a non-negative integer");
485
+ } else if (opsBeforeReturn !== "sequenceNumber" && fromSequenceNumber !== undefined) {
486
+ // If opsBeforeReturn is not set to "sequenceNumber", then fromSequenceNumber should be undefined (default value).
487
+ // In this case, we should throw an error since opsBeforeReturn is not explicitly set to "sequenceNumber".
488
+ throw new UsageError('opsBeforeReturn must be set to "sequenceNumber"');
489
+ }
464
490
 
465
491
  let container: Container;
466
492
  if (canCache) {
@@ -477,24 +503,11 @@ export class Loader implements IHostLoader {
477
503
  container = await this.loadContainer(request, resolvedAsFluid, pendingLocalState);
478
504
  }
479
505
 
480
- if (container.deltaManager.lastSequenceNumber <= fromSequenceNumber) {
481
- await new Promise<void>((resolve, reject) => {
482
- function opHandler(message: ISequencedDocumentMessage) {
483
- if (message.sequenceNumber > fromSequenceNumber) {
484
- resolve();
485
- container.removeListener("op", opHandler);
486
- }
487
- }
488
-
489
- container.on("op", opHandler);
490
- });
491
- }
492
-
493
506
  return { container, parsed };
494
507
  }
495
508
 
496
509
  private get cachingEnabled() {
497
- return this.services.options.cache !== false;
510
+ return this.services.options.cache === true;
498
511
  }
499
512
 
500
513
  private async loadContainer(
@@ -508,6 +521,7 @@ export class Loader implements IHostLoader {
508
521
  version: request.headers?.[LoaderHeader.version] ?? undefined,
509
522
  loadMode: request.headers?.[LoaderHeader.loadMode],
510
523
  pendingLocalState,
524
+ loadToSequenceNumber: request.headers?.[LoaderHeader.sequenceNumber],
511
525
  },
512
526
  {
513
527
  canReconnect: request.headers?.[LoaderHeader.reconnect],
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/container-loader";
9
- export const pkgVersion = "2.0.0-internal.5.4.2";
9
+ export const pkgVersion = "2.0.0-internal.6.0.1";
package/src/protocol.ts CHANGED
@@ -55,7 +55,6 @@ export class ProtocolHandler extends ProtocolOpHandler implements IProtocolHandl
55
55
  super(
56
56
  attributes.minimumSequenceNumber,
57
57
  attributes.sequenceNumber,
58
- OnlyValidTermValue,
59
58
  quorumSnapshot.members,
60
59
  quorumSnapshot.proposals,
61
60
  quorumSnapshot.values,
package/src/utils.ts CHANGED
@@ -14,6 +14,7 @@ import {
14
14
  import { ISummaryTree, ISnapshotTree, SummaryType } from "@fluidframework/protocol-definitions";
15
15
  import { LoggingError } from "@fluidframework/telemetry-utils";
16
16
  import {
17
+ CombinedAppAndProtocolSummary,
17
18
  DeltaStreamConnectionForbiddenError,
18
19
  isCombinedAppAndProtocolSummary,
19
20
  } from "@fluidframework/driver-utils";
@@ -51,6 +52,34 @@ export function parseUrl(url: string): IParsedUrl | undefined {
51
52
  : undefined;
52
53
  }
53
54
 
55
+ /**
56
+ * Combine the app summary and protocol summary in 1 tree.
57
+ * @param appSummary - Summary of the app.
58
+ * @param protocolSummary - Summary of the protocol.
59
+ * @internal
60
+ */
61
+ export function combineAppAndProtocolSummary(
62
+ appSummary: ISummaryTree,
63
+ protocolSummary: ISummaryTree,
64
+ ): CombinedAppAndProtocolSummary {
65
+ assert(
66
+ !isCombinedAppAndProtocolSummary(appSummary),
67
+ 0x5a8 /* app summary is already a combined tree! */,
68
+ );
69
+ assert(
70
+ !isCombinedAppAndProtocolSummary(protocolSummary),
71
+ 0x5a9 /* protocol summary is already a combined tree! */,
72
+ );
73
+ const createNewSummary: CombinedAppAndProtocolSummary = {
74
+ type: SummaryType.Tree,
75
+ tree: {
76
+ ".protocol": protocolSummary,
77
+ ".app": appSummary,
78
+ },
79
+ };
80
+ return createNewSummary;
81
+ }
82
+
54
83
  /**
55
84
  * Converts summary tree (for upload) to snapshot tree (for download).
56
85
  * Summary tree blobs contain contents, but snapshot tree blobs normally