@fluidframework/routerlicious-driver 2.0.0-internal.3.0.5 → 2.0.0-internal.3.1.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 (138) hide show
  1. package/.eslintrc.js +10 -12
  2. package/.mocharc.js +2 -2
  3. package/README.md +1 -1
  4. package/api-extractor.json +2 -2
  5. package/dist/cache.d.ts.map +1 -1
  6. package/dist/cache.js +2 -5
  7. package/dist/cache.js.map +1 -1
  8. package/dist/createNewUtils.d.ts.map +1 -1
  9. package/dist/createNewUtils.js +4 -2
  10. package/dist/createNewUtils.js.map +1 -1
  11. package/dist/defaultTokenProvider.d.ts.map +1 -1
  12. package/dist/defaultTokenProvider.js.map +1 -1
  13. package/dist/definitions.d.ts.map +1 -1
  14. package/dist/definitions.js.map +1 -1
  15. package/dist/deltaStorageService.d.ts.map +1 -1
  16. package/dist/deltaStorageService.js +4 -1
  17. package/dist/deltaStorageService.js.map +1 -1
  18. package/dist/documentDeltaConnection.d.ts.map +1 -1
  19. package/dist/documentDeltaConnection.js.map +1 -1
  20. package/dist/documentService.d.ts.map +1 -1
  21. package/dist/documentService.js +13 -5
  22. package/dist/documentService.js.map +1 -1
  23. package/dist/documentServiceFactory.d.ts.map +1 -1
  24. package/dist/documentServiceFactory.js +7 -4
  25. package/dist/documentServiceFactory.js.map +1 -1
  26. package/dist/documentStorageService.d.ts.map +1 -1
  27. package/dist/documentStorageService.js +7 -5
  28. package/dist/documentStorageService.js.map +1 -1
  29. package/dist/errorUtils.d.ts +9 -2
  30. package/dist/errorUtils.d.ts.map +1 -1
  31. package/dist/errorUtils.js +15 -8
  32. package/dist/errorUtils.js.map +1 -1
  33. package/dist/index.d.ts +2 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +4 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/nullBlobStorageService.d.ts.map +1 -1
  38. package/dist/nullBlobStorageService.js.map +1 -1
  39. package/dist/packageVersion.d.ts +1 -1
  40. package/dist/packageVersion.js +1 -1
  41. package/dist/packageVersion.js.map +1 -1
  42. package/dist/policies.d.ts.map +1 -1
  43. package/dist/policies.js.map +1 -1
  44. package/dist/restWrapper.d.ts.map +1 -1
  45. package/dist/restWrapper.js +5 -6
  46. package/dist/restWrapper.js.map +1 -1
  47. package/dist/retriableGitManager.d.ts.map +1 -1
  48. package/dist/retriableGitManager.js.map +1 -1
  49. package/dist/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  50. package/dist/shreddedSummaryDocumentStorageService.js +8 -4
  51. package/dist/shreddedSummaryDocumentStorageService.js.map +1 -1
  52. package/dist/tokens.d.ts +24 -7
  53. package/dist/tokens.d.ts.map +1 -1
  54. package/dist/tokens.js.map +1 -1
  55. package/dist/urlUtils.d.ts.map +1 -1
  56. package/dist/urlUtils.js.map +1 -1
  57. package/dist/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  58. package/dist/wholeSummaryDocumentStorageService.js +25 -11
  59. package/dist/wholeSummaryDocumentStorageService.js.map +1 -1
  60. package/lib/cache.d.ts.map +1 -1
  61. package/lib/cache.js +2 -5
  62. package/lib/cache.js.map +1 -1
  63. package/lib/createNewUtils.d.ts.map +1 -1
  64. package/lib/createNewUtils.js +4 -2
  65. package/lib/createNewUtils.js.map +1 -1
  66. package/lib/defaultTokenProvider.d.ts.map +1 -1
  67. package/lib/defaultTokenProvider.js.map +1 -1
  68. package/lib/definitions.d.ts.map +1 -1
  69. package/lib/definitions.js.map +1 -1
  70. package/lib/deltaStorageService.d.ts.map +1 -1
  71. package/lib/deltaStorageService.js +4 -1
  72. package/lib/deltaStorageService.js.map +1 -1
  73. package/lib/documentDeltaConnection.d.ts.map +1 -1
  74. package/lib/documentDeltaConnection.js.map +1 -1
  75. package/lib/documentService.d.ts.map +1 -1
  76. package/lib/documentService.js +15 -7
  77. package/lib/documentService.js.map +1 -1
  78. package/lib/documentServiceFactory.d.ts.map +1 -1
  79. package/lib/documentServiceFactory.js +7 -4
  80. package/lib/documentServiceFactory.js.map +1 -1
  81. package/lib/documentStorageService.d.ts.map +1 -1
  82. package/lib/documentStorageService.js +8 -6
  83. package/lib/documentStorageService.js.map +1 -1
  84. package/lib/errorUtils.d.ts +9 -2
  85. package/lib/errorUtils.d.ts.map +1 -1
  86. package/lib/errorUtils.js +14 -7
  87. package/lib/errorUtils.js.map +1 -1
  88. package/lib/index.d.ts +2 -1
  89. package/lib/index.d.ts.map +1 -1
  90. package/lib/index.js +3 -1
  91. package/lib/index.js.map +1 -1
  92. package/lib/nullBlobStorageService.d.ts.map +1 -1
  93. package/lib/nullBlobStorageService.js.map +1 -1
  94. package/lib/packageVersion.d.ts +1 -1
  95. package/lib/packageVersion.js +1 -1
  96. package/lib/packageVersion.js.map +1 -1
  97. package/lib/policies.d.ts.map +1 -1
  98. package/lib/policies.js.map +1 -1
  99. package/lib/restWrapper.d.ts.map +1 -1
  100. package/lib/restWrapper.js +5 -6
  101. package/lib/restWrapper.js.map +1 -1
  102. package/lib/retriableGitManager.d.ts.map +1 -1
  103. package/lib/retriableGitManager.js.map +1 -1
  104. package/lib/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  105. package/lib/shreddedSummaryDocumentStorageService.js +9 -5
  106. package/lib/shreddedSummaryDocumentStorageService.js.map +1 -1
  107. package/lib/tokens.d.ts +24 -7
  108. package/lib/tokens.d.ts.map +1 -1
  109. package/lib/tokens.js.map +1 -1
  110. package/lib/urlUtils.d.ts.map +1 -1
  111. package/lib/urlUtils.js.map +1 -1
  112. package/lib/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  113. package/lib/wholeSummaryDocumentStorageService.js +27 -13
  114. package/lib/wholeSummaryDocumentStorageService.js.map +1 -1
  115. package/package.json +115 -114
  116. package/prettier.config.cjs +1 -1
  117. package/src/cache.ts +16 -19
  118. package/src/createNewUtils.ts +24 -22
  119. package/src/defaultTokenProvider.ts +13 -15
  120. package/src/definitions.ts +2 -2
  121. package/src/deltaStorageService.ts +99 -95
  122. package/src/documentDeltaConnection.ts +53 -47
  123. package/src/documentService.ts +260 -239
  124. package/src/documentServiceFactory.ts +263 -250
  125. package/src/documentStorageService.ts +87 -83
  126. package/src/errorUtils.ts +91 -81
  127. package/src/index.ts +7 -1
  128. package/src/nullBlobStorageService.ts +24 -21
  129. package/src/packageVersion.ts +1 -1
  130. package/src/policies.ts +44 -44
  131. package/src/restWrapper.ts +266 -216
  132. package/src/retriableGitManager.ts +152 -151
  133. package/src/shreddedSummaryDocumentStorageService.ts +202 -194
  134. package/src/tokens.ts +69 -44
  135. package/src/urlUtils.ts +26 -23
  136. package/src/wholeSummaryDocumentStorageService.ts +246 -228
  137. package/tsconfig.esnext.json +6 -6
  138. package/tsconfig.json +9 -13
@@ -4,10 +4,10 @@
4
4
  */
5
5
 
6
6
  import {
7
- IDeltaStorageService,
8
- IDocumentDeltaStorageService,
9
- IDeltasFetchResult,
10
- IStream,
7
+ IDeltaStorageService,
8
+ IDocumentDeltaStorageService,
9
+ IDeltasFetchResult,
10
+ IStream,
11
11
  } from "@fluidframework/driver-definitions";
12
12
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
13
13
  import { readAndParse, requestOps, emptyMessageStream } from "@fluidframework/driver-utils";
@@ -22,108 +22,112 @@ const MaxBatchDeltas = 2000; // Maximum number of ops we can fetch at a time
22
22
  * Storage service limited to only being able to fetch documents for a specific document
23
23
  */
24
24
  export class DocumentDeltaStorageService implements IDocumentDeltaStorageService {
25
- constructor(
26
- private readonly tenantId: string,
27
- private readonly id: string,
28
- private readonly deltaStorageService: IDeltaStorageService,
29
- private readonly documentStorageService: DocumentStorageService,
30
- private readonly logger: ITelemetryLogger) {
31
- }
25
+ constructor(
26
+ private readonly tenantId: string,
27
+ private readonly id: string,
28
+ private readonly deltaStorageService: IDeltaStorageService,
29
+ private readonly documentStorageService: DocumentStorageService,
30
+ private readonly logger: ITelemetryLogger,
31
+ ) {}
32
32
 
33
- private logtailSha: string | undefined = this.documentStorageService.logTailSha;
33
+ private logtailSha: string | undefined = this.documentStorageService.logTailSha;
34
34
 
35
- fetchMessages(from: number,
36
- to: number | undefined,
37
- abortSignal?: AbortSignal,
38
- cachedOnly?: boolean,
39
- fetchReason?: string,
40
- ): IStream<ISequencedDocumentMessage[]> {
41
- if (cachedOnly) {
42
- return emptyMessageStream;
43
- }
44
- return requestOps(
45
- this.getCore.bind(this),
46
- // Staging: starting with no concurrency, listening for feedback first.
47
- // In future releases we will switch to actual concurrency
48
- 1, // concurrency
49
- from, // inclusive
50
- to, // exclusive
51
- MaxBatchDeltas,
52
- new TelemetryNullLogger(),
53
- abortSignal,
54
- fetchReason,
55
- );
56
- }
35
+ fetchMessages(
36
+ from: number,
37
+ to: number | undefined,
38
+ abortSignal?: AbortSignal,
39
+ cachedOnly?: boolean,
40
+ fetchReason?: string,
41
+ ): IStream<ISequencedDocumentMessage[]> {
42
+ if (cachedOnly) {
43
+ return emptyMessageStream;
44
+ }
45
+ return requestOps(
46
+ this.getCore.bind(this),
47
+ // Staging: starting with no concurrency, listening for feedback first.
48
+ // In future releases we will switch to actual concurrency
49
+ 1, // concurrency
50
+ from, // inclusive
51
+ to, // exclusive
52
+ MaxBatchDeltas,
53
+ new TelemetryNullLogger(),
54
+ abortSignal,
55
+ fetchReason,
56
+ );
57
+ }
57
58
 
58
- private async getCore(from: number, to: number): Promise<IDeltasFetchResult> {
59
- const opsFromLogTail = this.logtailSha
60
- ? await readAndParse<ISequencedDocumentMessage[]>(this.documentStorageService, this.logtailSha)
61
- : [];
59
+ private async getCore(from: number, to: number): Promise<IDeltasFetchResult> {
60
+ const opsFromLogTail = this.logtailSha
61
+ ? await readAndParse<ISequencedDocumentMessage[]>(
62
+ this.documentStorageService,
63
+ this.logtailSha,
64
+ )
65
+ : [];
62
66
 
63
- this.logtailSha = undefined;
64
- if (opsFromLogTail.length > 0) {
65
- try {
66
- const messages = opsFromLogTail.filter((op, i) => {
67
- // throw if the sequence numbers in logtail are not contiguous
68
- if (i > 0 && op.sequenceNumber !== opsFromLogTail[i - 1].sequenceNumber + 1) {
69
- throw new Error("Log tail ops are not contiguous");
70
- }
71
- return op.sequenceNumber >= from;
72
- });
73
-
74
- if (messages.length > 0 && messages[0].sequenceNumber === from) {
75
- return { messages, partialResult: true };
76
- }
77
- } catch (error) {
78
- this.logger.sendErrorEvent({ eventName: "LogTailReadError" }, error);
79
- }
80
- }
67
+ this.logtailSha = undefined;
68
+ if (opsFromLogTail.length > 0) {
69
+ try {
70
+ const messages = opsFromLogTail.filter((op, i) => {
71
+ // throw if the sequence numbers in logtail are not contiguous
72
+ if (i > 0 && op.sequenceNumber !== opsFromLogTail[i - 1].sequenceNumber + 1) {
73
+ throw new Error("Log tail ops are not contiguous");
74
+ }
75
+ return op.sequenceNumber >= from;
76
+ });
81
77
 
82
- return this.deltaStorageService.get(this.tenantId, this.id, from, to);
83
- }
78
+ if (messages.length > 0 && messages[0].sequenceNumber === from) {
79
+ return { messages, partialResult: true };
80
+ }
81
+ } catch (error) {
82
+ this.logger.sendErrorEvent({ eventName: "LogTailReadError" }, error);
83
+ }
84
+ }
85
+
86
+ return this.deltaStorageService.get(this.tenantId, this.id, from, to);
87
+ }
84
88
  }
85
89
 
86
90
  /**
87
91
  * Provides access to the underlying delta storage on the server for routerlicious driver.
88
92
  */
89
93
  export class DeltaStorageService implements IDeltaStorageService {
90
- constructor(
91
- private readonly url: string,
92
- private readonly restWrapper: RestWrapper,
93
- private readonly logger: ITelemetryLogger,
94
- private readonly getRestWrapper: () => Promise<RestWrapper> = async () => this.restWrapper,
95
- private readonly getDeltaStorageUrl: () => string = () => this.url,
96
- ) {
97
- }
94
+ constructor(
95
+ private readonly url: string,
96
+ private readonly restWrapper: RestWrapper,
97
+ private readonly logger: ITelemetryLogger,
98
+ private readonly getRestWrapper: () => Promise<RestWrapper> = async () => this.restWrapper,
99
+ private readonly getDeltaStorageUrl: () => string = () => this.url,
100
+ ) {}
98
101
 
99
- public async get(
100
- tenantId: string,
101
- id: string,
102
- from: number, // inclusive
103
- to: number, // exclusive
104
- ): Promise<IDeltasFetchResult> {
105
- const ops = await PerformanceEvent.timedExecAsync(
106
- this.logger,
107
- {
108
- eventName: "getDeltas",
109
- from,
110
- to,
111
- },
112
- async (event) => {
113
- const restWrapper = await this.getRestWrapper();
114
- const url = this.getDeltaStorageUrl();
115
- const response = await restWrapper.get<ISequencedDocumentMessage[]>(
116
- url,
117
- { from: from - 1, to });
118
- event.end({
119
- count: response.length,
120
- });
121
- return response;
122
- },
123
- );
102
+ public async get(
103
+ tenantId: string,
104
+ id: string,
105
+ from: number, // inclusive
106
+ to: number, // exclusive
107
+ ): Promise<IDeltasFetchResult> {
108
+ const ops = await PerformanceEvent.timedExecAsync(
109
+ this.logger,
110
+ {
111
+ eventName: "getDeltas",
112
+ from,
113
+ to,
114
+ },
115
+ async (event) => {
116
+ const restWrapper = await this.getRestWrapper();
117
+ const url = this.getDeltaStorageUrl();
118
+ const response = await restWrapper.get<ISequencedDocumentMessage[]>(url, {
119
+ from: from - 1,
120
+ to,
121
+ });
122
+ event.end({
123
+ count: response.length,
124
+ });
125
+ return response;
126
+ },
127
+ );
124
128
 
125
- // It is assumed that server always returns all the ops that it has in the range that was requested.
126
- // This may change in the future, if so, we need to adjust and receive "end" value from server in such case.
127
- return { messages: ops, partialResult: false };
128
- }
129
+ // It is assumed that server always returns all the ops that it has in the range that was requested.
130
+ // This may change in the future, if so, we need to adjust and receive "end" value from server in such case.
131
+ return { messages: ops, partialResult: false };
132
+ }
129
133
  }
@@ -17,55 +17,61 @@ const protocolVersions = ["^0.4.0", "^0.3.0", "^0.2.0", "^0.1.0"];
17
17
  * Wrapper over the shared one for driver specific translation.
18
18
  */
19
19
  export class R11sDocumentDeltaConnection extends DocumentDeltaConnection {
20
- public static async create(
21
- tenantId: string,
22
- id: string,
23
- token: string | null,
24
- io: typeof SocketIOClientStatic,
25
- client: IClient,
26
- url: string,
27
- logger: ITelemetryLogger,
28
- timeoutMs = 20000): Promise<IDocumentDeltaConnection> {
29
- const socket = io(
30
- url,
31
- {
32
- query: {
33
- documentId: id,
34
- tenantId,
35
- },
36
- reconnection: false,
37
- // Default to websocket connection, with long-polling disabled
38
- transports: ["websocket"],
39
- timeout: timeoutMs,
40
- });
20
+ public static async create(
21
+ tenantId: string,
22
+ id: string,
23
+ token: string | null,
24
+ io: typeof SocketIOClientStatic,
25
+ client: IClient,
26
+ url: string,
27
+ logger: ITelemetryLogger,
28
+ timeoutMs = 20000,
29
+ ): Promise<IDocumentDeltaConnection> {
30
+ const socket = io(url, {
31
+ query: {
32
+ documentId: id,
33
+ tenantId,
34
+ },
35
+ reconnection: false,
36
+ // Default to websocket connection, with long-polling disabled
37
+ transports: ["websocket"],
38
+ timeout: timeoutMs,
39
+ });
41
40
 
42
- const connectMessage: IConnect = {
43
- client,
44
- id,
45
- mode: client.mode,
46
- tenantId,
47
- token, // Token is going to indicate tenant level information, etc...
48
- versions: protocolVersions,
49
- relayUserAgent: [client.details.environment, ` driverVersion:${driverVersion}`].join(";"),
50
- };
41
+ const connectMessage: IConnect = {
42
+ client,
43
+ id,
44
+ mode: client.mode,
45
+ tenantId,
46
+ token, // Token is going to indicate tenant level information, etc...
47
+ versions: protocolVersions,
48
+ relayUserAgent: [client.details.environment, ` driverVersion:${driverVersion}`].join(
49
+ ";",
50
+ ),
51
+ };
51
52
 
52
- // TODO: expose to host at factory level
53
- const enableLongPollingDowngrades = true;
54
- const deltaConnection = new R11sDocumentDeltaConnection(socket, id, logger, enableLongPollingDowngrades);
53
+ // TODO: expose to host at factory level
54
+ const enableLongPollingDowngrades = true;
55
+ const deltaConnection = new R11sDocumentDeltaConnection(
56
+ socket,
57
+ id,
58
+ logger,
59
+ enableLongPollingDowngrades,
60
+ );
55
61
 
56
- await deltaConnection.initialize(connectMessage, timeoutMs);
57
- return deltaConnection;
58
- }
62
+ await deltaConnection.initialize(connectMessage, timeoutMs);
63
+ return deltaConnection;
64
+ }
59
65
 
60
- /**
61
- * Error raising for socket.io issues
62
- */
63
- protected createErrorObject(handler: string, error?: any, canRetry = true): IAnyDriverError {
64
- // Note: we suspect the incoming error object is either:
65
- // - a socketError: add it to the R11sError object for driver to be able to parse it and reason over it.
66
- // - anything else: let base class handle it
67
- return canRetry && Number.isInteger(error?.code) && typeof error?.message === "string"
68
- ? errorObjectFromSocketError(error as IR11sSocketError, handler)
69
- : super.createErrorObject(handler, error, canRetry);
70
- }
66
+ /**
67
+ * Error raising for socket.io issues
68
+ */
69
+ protected createErrorObject(handler: string, error?: any, canRetry = true): IAnyDriverError {
70
+ // Note: we suspect the incoming error object is either:
71
+ // - a socketError: add it to the R11sError object for driver to be able to parse it and reason over it.
72
+ // - anything else: let base class handle it
73
+ return canRetry && Number.isInteger(error?.code) && typeof error?.message === "string"
74
+ ? errorObjectFromSocketError(error as IR11sSocketError, handler)
75
+ : super.createErrorObject(handler, error, canRetry);
76
+ }
71
77
  }