@fluidframework/driver-base 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.225277

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 (73) hide show
  1. package/.eslintrc.js +8 -7
  2. package/.mocharc.js +12 -0
  3. package/CHANGELOG.md +117 -0
  4. package/README.md +37 -1
  5. package/api-extractor-esm.json +4 -0
  6. package/api-extractor-lint.json +4 -0
  7. package/api-extractor.json +2 -2
  8. package/api-report/driver-base.api.md +112 -0
  9. package/dist/{documentDeltaConnection.js → documentDeltaConnection.cjs} +228 -113
  10. package/dist/documentDeltaConnection.cjs.map +1 -0
  11. package/dist/documentDeltaConnection.d.ts +34 -18
  12. package/dist/documentDeltaConnection.d.ts.map +1 -1
  13. package/dist/driver-base-alpha.d.ts +26 -0
  14. package/dist/driver-base-beta.d.ts +30 -0
  15. package/dist/driver-base-public.d.ts +30 -0
  16. package/dist/driver-base-untrimmed.d.ts +213 -0
  17. package/dist/driverUtils.cjs +146 -0
  18. package/dist/driverUtils.cjs.map +1 -0
  19. package/dist/driverUtils.d.ts +36 -0
  20. package/dist/driverUtils.d.ts.map +1 -0
  21. package/dist/index.cjs +14 -0
  22. package/dist/index.cjs.map +1 -0
  23. package/dist/index.d.ts +2 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
  26. package/dist/packageVersion.cjs.map +1 -0
  27. package/dist/packageVersion.d.ts +1 -1
  28. package/dist/packageVersion.d.ts.map +1 -1
  29. package/dist/tsdoc-metadata.json +11 -0
  30. package/lib/{documentDeltaConnection.d.ts → documentDeltaConnection.d.mts} +35 -19
  31. package/lib/documentDeltaConnection.d.mts.map +1 -0
  32. package/lib/{documentDeltaConnection.js → documentDeltaConnection.mjs} +218 -104
  33. package/lib/documentDeltaConnection.mjs.map +1 -0
  34. package/lib/driver-base-alpha.d.mts +26 -0
  35. package/lib/driver-base-beta.d.mts +30 -0
  36. package/lib/driver-base-public.d.mts +30 -0
  37. package/lib/driver-base-untrimmed.d.mts +213 -0
  38. package/lib/driverUtils.d.mts +36 -0
  39. package/lib/driverUtils.d.mts.map +1 -0
  40. package/lib/driverUtils.mjs +140 -0
  41. package/lib/driverUtils.mjs.map +1 -0
  42. package/lib/index.d.mts +7 -0
  43. package/lib/index.d.mts.map +1 -0
  44. package/lib/index.mjs +7 -0
  45. package/lib/index.mjs.map +1 -0
  46. package/lib/{packageVersion.d.ts → packageVersion.d.mts} +2 -2
  47. package/lib/packageVersion.d.mts.map +1 -0
  48. package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
  49. package/lib/packageVersion.mjs.map +1 -0
  50. package/package.json +151 -43
  51. package/{lib/index.d.ts → prettier.config.cjs} +4 -2
  52. package/src/documentDeltaConnection.ts +748 -563
  53. package/src/driverUtils.ts +159 -0
  54. package/src/index.ts +2 -1
  55. package/src/packageVersion.ts +1 -1
  56. package/tsc-multi.test.json +4 -0
  57. package/tsconfig.json +11 -13
  58. package/dist/documentDeltaConnection.js.map +0 -1
  59. package/dist/index.js +0 -18
  60. package/dist/index.js.map +0 -1
  61. package/dist/packageVersion.js.map +0 -1
  62. package/lib/documentDeltaConnection.d.ts.map +0 -1
  63. package/lib/documentDeltaConnection.js.map +0 -1
  64. package/lib/index.d.ts.map +0 -1
  65. package/lib/index.js +0 -6
  66. package/lib/index.js.map +0 -1
  67. package/lib/packageVersion.d.ts.map +0 -1
  68. package/lib/packageVersion.js.map +0 -1
  69. package/lib/test/types/validateDriverBasePrevious.d.ts +0 -2
  70. package/lib/test/types/validateDriverBasePrevious.d.ts.map +0 -1
  71. package/lib/test/types/validateDriverBasePrevious.js +0 -4
  72. package/lib/test/types/validateDriverBasePrevious.js.map +0 -1
  73. package/tsconfig.esnext.json +0 -7
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.validateMessages = exports.promiseRaceWithWinner = exports.getW3CData = void 0;
8
+ const client_utils_1 = require("@fluid-internal/client-utils");
9
+ /**
10
+ * Extract and return the w3c data.
11
+ * @param url - request url for which w3c data needs to be reported.
12
+ * @param initiatorType - type of the network call
13
+ * @internal
14
+ */
15
+ function getW3CData(url, initiatorType) {
16
+ // From: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming
17
+ // fetchStart: immediately before the browser starts to fetch the resource.
18
+ // requestStart: immediately before the browser starts requesting the resource from the server
19
+ // responseStart: immediately after the browser receives the first byte of the response from the server.
20
+ // responseEnd: immediately after the browser receives the last byte of the resource
21
+ // or immediately before the transport connection is closed, whichever comes first.
22
+ // secureConnectionStart: immediately before the browser starts the handshake process to secure the
23
+ // current connection. If a secure connection is not used, this property returns zero.
24
+ // startTime: Time when the resource fetch started. This value is equivalent to fetchStart.
25
+ // domainLookupStart: immediately before the browser starts the domain name lookup for the resource.
26
+ // domainLookupEnd: immediately after the browser finishes the domain name lookup for the resource.
27
+ // redirectStart: start time of the fetch which that initiates the redirect.
28
+ // redirectEnd: immediately after receiving the last byte of the response of the last redirect.
29
+ // Interval between start and finish of the domain name lookup for the resource.
30
+ let dnsLookupTime; // domainLookupEnd - domainLookupStart
31
+ // Interval between the first fetch until the last byte of the last redirect.
32
+ let redirectTime; // redirectEnd - redirectStart
33
+ // Time to establish the connection to the server to retrieve the resource.
34
+ let tcpHandshakeTime; // connectEnd - connectStart
35
+ // Time from the end of the connection until the inital handshake process to secure the connection.
36
+ // If 0, then no time is spent here.
37
+ let secureConnectionTime; // connectEnd - secureConnectionStart
38
+ // Interval to receive all (first to last) bytes form the server.
39
+ let responseNetworkTime; // responsEnd - responseStart
40
+ // Interval between the initial fetch until the last byte is received.
41
+ // Likely same as fetchTime + receiveContentTime.
42
+ let fetchStartToResponseEndTime; // responseEnd - fetchStart
43
+ // reqStartToResponseEndTime = fetchStartToResponseEndTime - <initial TCP handshake>
44
+ // Interval between starting the request for the resource until receiving the last byte.
45
+ let reqStartToResponseEndTime; // responseEnd - requestStart
46
+ let w3cStartTime; // W3C Start time = fetchStart time
47
+ // getEntriesByType is only available in browser performance object
48
+ const resources1 = client_utils_1.performance.getEntriesByType?.("resource") ?? [];
49
+ // Usually the latest fetch call is to the end of resources, so we start from the end.
50
+ for (let i = resources1.length - 1; i > 0; i--) {
51
+ const indResTime = resources1[i];
52
+ const resource_name = indResTime.name.toString();
53
+ const resource_initiatortype = indResTime.initiatorType;
54
+ if (resource_initiatortype.localeCompare(initiatorType) === 0 &&
55
+ resource_name.includes(url)) {
56
+ redirectTime = indResTime.redirectEnd - indResTime.redirectStart;
57
+ w3cStartTime = indResTime.fetchStart;
58
+ dnsLookupTime = indResTime.domainLookupEnd - indResTime.domainLookupStart;
59
+ tcpHandshakeTime = indResTime.connectEnd - indResTime.connectStart;
60
+ secureConnectionTime =
61
+ indResTime.secureConnectionStart > 0
62
+ ? indResTime.connectEnd - indResTime.secureConnectionStart
63
+ : 0;
64
+ responseNetworkTime =
65
+ indResTime.responseStart > 0
66
+ ? indResTime.responseEnd - indResTime.responseStart
67
+ : undefined;
68
+ fetchStartToResponseEndTime =
69
+ indResTime.fetchStart > 0
70
+ ? indResTime.responseEnd - indResTime.fetchStart
71
+ : undefined;
72
+ reqStartToResponseEndTime =
73
+ indResTime.requestStart > 0
74
+ ? indResTime.responseEnd - indResTime.requestStart
75
+ : undefined;
76
+ break;
77
+ }
78
+ }
79
+ return {
80
+ dnsLookupTime,
81
+ w3cStartTime,
82
+ redirectTime,
83
+ tcpHandshakeTime,
84
+ secureConnectionTime,
85
+ responseNetworkTime,
86
+ fetchStartToResponseEndTime,
87
+ reqStartToResponseEndTime,
88
+ };
89
+ }
90
+ exports.getW3CData = getW3CData;
91
+ /**
92
+ * An implementation of Promise.race that gives you the winner of the promise race.
93
+ * If one of the promises is rejected before any other is resolved, this method will return the error/reason from that rejection.
94
+ * @internal
95
+ */
96
+ async function promiseRaceWithWinner(promises) {
97
+ return new Promise((resolve, reject) => {
98
+ promises.forEach((p, index) => {
99
+ p.then((v) => resolve({ index, value: v })).catch(reject);
100
+ });
101
+ });
102
+ }
103
+ exports.promiseRaceWithWinner = promiseRaceWithWinner;
104
+ /**
105
+ * @internal
106
+ */
107
+ function validateMessages(reason, messages, from, logger, strict = true) {
108
+ if (messages.length !== 0) {
109
+ const start = messages[0].sequenceNumber;
110
+ const length = messages.length;
111
+ const last = messages[length - 1].sequenceNumber;
112
+ if (last + 1 !== from + length) {
113
+ // If not strict, then return the first consecutive sub-block. If strict or start
114
+ // seq number is not what we expected, then return no ops.
115
+ if (strict || from !== start) {
116
+ messages.length = 0;
117
+ }
118
+ else {
119
+ let validOpsCount = 1;
120
+ while (validOpsCount < messages.length &&
121
+ messages[validOpsCount].sequenceNumber ===
122
+ messages[validOpsCount - 1].sequenceNumber + 1) {
123
+ validOpsCount++;
124
+ }
125
+ messages.length = validOpsCount;
126
+ }
127
+ logger.sendErrorEvent({
128
+ eventName: "OpsFetchViolation",
129
+ reason,
130
+ from,
131
+ start,
132
+ last,
133
+ length,
134
+ details: JSON.stringify({
135
+ validLength: messages.length,
136
+ lastValidOpSeqNumber: messages.length > 0
137
+ ? messages[messages.length - 1].sequenceNumber
138
+ : undefined,
139
+ strict,
140
+ }),
141
+ });
142
+ }
143
+ }
144
+ }
145
+ exports.validateMessages = validateMessages;
146
+ //# sourceMappingURL=driverUtils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driverUtils.cjs","sourceRoot":"","sources":["../src/driverUtils.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 { performance } from \"@fluid-internal/client-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils\";\n\n/**\n * Extract and return the w3c data.\n * @param url - request url for which w3c data needs to be reported.\n * @param initiatorType - type of the network call\n * @internal\n */\nexport function getW3CData(url: string, initiatorType: string) {\n\t// From: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming\n\t// fetchStart: immediately before the browser starts to fetch the resource.\n\t// requestStart: immediately before the browser starts requesting the resource from the server\n\t// responseStart: immediately after the browser receives the first byte of the response from the server.\n\t// responseEnd: immediately after the browser receives the last byte of the resource\n\t// or immediately before the transport connection is closed, whichever comes first.\n\t// secureConnectionStart: immediately before the browser starts the handshake process to secure the\n\t// current connection. If a secure connection is not used, this property returns zero.\n\t// startTime: Time when the resource fetch started. This value is equivalent to fetchStart.\n\t// domainLookupStart: immediately before the browser starts the domain name lookup for the resource.\n\t// domainLookupEnd: immediately after the browser finishes the domain name lookup for the resource.\n\t// redirectStart: start time of the fetch which that initiates the redirect.\n\t// redirectEnd: immediately after receiving the last byte of the response of the last redirect.\n\n\t// Interval between start and finish of the domain name lookup for the resource.\n\tlet dnsLookupTime: number | undefined; // domainLookupEnd - domainLookupStart\n\t// Interval between the first fetch until the last byte of the last redirect.\n\tlet redirectTime: number | undefined; // redirectEnd - redirectStart\n\t// Time to establish the connection to the server to retrieve the resource.\n\tlet tcpHandshakeTime: number | undefined; // connectEnd - connectStart\n\t// Time from the end of the connection until the inital handshake process to secure the connection.\n\t// If 0, then no time is spent here.\n\tlet secureConnectionTime: number | undefined; // connectEnd - secureConnectionStart\n\t// Interval to receive all (first to last) bytes form the server.\n\tlet responseNetworkTime: number | undefined; // responsEnd - responseStart\n\t// Interval between the initial fetch until the last byte is received.\n\t// Likely same as fetchTime + receiveContentTime.\n\tlet fetchStartToResponseEndTime: number | undefined; // responseEnd - fetchStart\n\t// reqStartToResponseEndTime = fetchStartToResponseEndTime - <initial TCP handshake>\n\t// Interval between starting the request for the resource until receiving the last byte.\n\tlet reqStartToResponseEndTime: number | undefined; // responseEnd - requestStart\n\tlet w3cStartTime: number | undefined; // W3C Start time = fetchStart time\n\n\t// getEntriesByType is only available in browser performance object\n\tconst resources1 = performance.getEntriesByType?.(\"resource\") ?? [];\n\t// Usually the latest fetch call is to the end of resources, so we start from the end.\n\tfor (let i = resources1.length - 1; i > 0; i--) {\n\t\tconst indResTime = resources1[i] as PerformanceResourceTiming;\n\t\tconst resource_name = indResTime.name.toString();\n\t\tconst resource_initiatortype = indResTime.initiatorType;\n\t\tif (\n\t\t\tresource_initiatortype.localeCompare(initiatorType) === 0 &&\n\t\t\tresource_name.includes(url)\n\t\t) {\n\t\t\tredirectTime = indResTime.redirectEnd - indResTime.redirectStart;\n\t\t\tw3cStartTime = indResTime.fetchStart;\n\t\t\tdnsLookupTime = indResTime.domainLookupEnd - indResTime.domainLookupStart;\n\t\t\ttcpHandshakeTime = indResTime.connectEnd - indResTime.connectStart;\n\t\t\tsecureConnectionTime =\n\t\t\t\tindResTime.secureConnectionStart > 0\n\t\t\t\t\t? indResTime.connectEnd - indResTime.secureConnectionStart\n\t\t\t\t\t: 0;\n\t\t\tresponseNetworkTime =\n\t\t\t\tindResTime.responseStart > 0\n\t\t\t\t\t? indResTime.responseEnd - indResTime.responseStart\n\t\t\t\t\t: undefined;\n\t\t\tfetchStartToResponseEndTime =\n\t\t\t\tindResTime.fetchStart > 0\n\t\t\t\t\t? indResTime.responseEnd - indResTime.fetchStart\n\t\t\t\t\t: undefined;\n\t\t\treqStartToResponseEndTime =\n\t\t\t\tindResTime.requestStart > 0\n\t\t\t\t\t? indResTime.responseEnd - indResTime.requestStart\n\t\t\t\t\t: undefined;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn {\n\t\tdnsLookupTime,\n\t\tw3cStartTime,\n\t\tredirectTime,\n\t\ttcpHandshakeTime,\n\t\tsecureConnectionTime,\n\t\tresponseNetworkTime,\n\t\tfetchStartToResponseEndTime,\n\t\treqStartToResponseEndTime,\n\t};\n}\n\n/**\n * An implementation of Promise.race that gives you the winner of the promise race.\n * If one of the promises is rejected before any other is resolved, this method will return the error/reason from that rejection.\n * @internal\n */\nexport async function promiseRaceWithWinner<T>(\n\tpromises: Promise<T>[],\n): Promise<{ index: number; value: T }> {\n\treturn new Promise((resolve, reject) => {\n\t\tpromises.forEach((p, index) => {\n\t\t\tp.then((v) => resolve({ index, value: v })).catch(reject);\n\t\t});\n\t});\n}\n\n/**\n * @internal\n */\nexport function validateMessages(\n\treason: string,\n\tmessages: ISequencedDocumentMessage[],\n\tfrom: number,\n\tlogger: ITelemetryLoggerExt,\n\tstrict: boolean = true,\n) {\n\tif (messages.length !== 0) {\n\t\tconst start = messages[0].sequenceNumber;\n\t\tconst length = messages.length;\n\t\tconst last = messages[length - 1].sequenceNumber;\n\t\tif (last + 1 !== from + length) {\n\t\t\t// If not strict, then return the first consecutive sub-block. If strict or start\n\t\t\t// seq number is not what we expected, then return no ops.\n\t\t\tif (strict || from !== start) {\n\t\t\t\tmessages.length = 0;\n\t\t\t} else {\n\t\t\t\tlet validOpsCount = 1;\n\t\t\t\twhile (\n\t\t\t\t\tvalidOpsCount < messages.length &&\n\t\t\t\t\tmessages[validOpsCount].sequenceNumber ===\n\t\t\t\t\t\tmessages[validOpsCount - 1].sequenceNumber + 1\n\t\t\t\t) {\n\t\t\t\t\tvalidOpsCount++;\n\t\t\t\t}\n\t\t\t\tmessages.length = validOpsCount;\n\t\t\t}\n\t\t\tlogger.sendErrorEvent({\n\t\t\t\teventName: \"OpsFetchViolation\",\n\t\t\t\treason,\n\t\t\t\tfrom,\n\t\t\t\tstart,\n\t\t\t\tlast,\n\t\t\t\tlength,\n\t\t\t\tdetails: JSON.stringify({\n\t\t\t\t\tvalidLength: messages.length,\n\t\t\t\t\tlastValidOpSeqNumber:\n\t\t\t\t\t\tmessages.length > 0\n\t\t\t\t\t\t\t? messages[messages.length - 1].sequenceNumber\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tstrict,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,36 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
6
+ import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
7
+ /**
8
+ * Extract and return the w3c data.
9
+ * @param url - request url for which w3c data needs to be reported.
10
+ * @param initiatorType - type of the network call
11
+ * @internal
12
+ */
13
+ export declare function getW3CData(url: string, initiatorType: string): {
14
+ dnsLookupTime: number | undefined;
15
+ w3cStartTime: number | undefined;
16
+ redirectTime: number | undefined;
17
+ tcpHandshakeTime: number | undefined;
18
+ secureConnectionTime: number | undefined;
19
+ responseNetworkTime: number | undefined;
20
+ fetchStartToResponseEndTime: number | undefined;
21
+ reqStartToResponseEndTime: number | undefined;
22
+ };
23
+ /**
24
+ * An implementation of Promise.race that gives you the winner of the promise race.
25
+ * If one of the promises is rejected before any other is resolved, this method will return the error/reason from that rejection.
26
+ * @internal
27
+ */
28
+ export declare function promiseRaceWithWinner<T>(promises: Promise<T>[]): Promise<{
29
+ index: number;
30
+ value: T;
31
+ }>;
32
+ /**
33
+ * @internal
34
+ */
35
+ export declare function validateMessages(reason: string, messages: ISequencedDocumentMessage[], from: number, logger: ITelemetryLoggerExt, strict?: boolean): void;
36
+ //# sourceMappingURL=driverUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driverUtils.d.ts","sourceRoot":"","sources":["../src/driverUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;;;;;;;;;EA8E5D;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAC5C,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GACpB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,CAMtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,yBAAyB,EAAE,EACrC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,mBAAmB,EAC3B,MAAM,GAAE,OAAc,QAwCtB"}
package/dist/index.cjs ADDED
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.validateMessages = exports.promiseRaceWithWinner = exports.getW3CData = exports.DocumentDeltaConnection = void 0;
8
+ var documentDeltaConnection_1 = require("./documentDeltaConnection.cjs");
9
+ Object.defineProperty(exports, "DocumentDeltaConnection", { enumerable: true, get: function () { return documentDeltaConnection_1.DocumentDeltaConnection; } });
10
+ var driverUtils_1 = require("./driverUtils.cjs");
11
+ Object.defineProperty(exports, "getW3CData", { enumerable: true, get: function () { return driverUtils_1.getW3CData; } });
12
+ Object.defineProperty(exports, "promiseRaceWithWinner", { enumerable: true, get: function () { return driverUtils_1.promiseRaceWithWinner; } });
13
+ Object.defineProperty(exports, "validateMessages", { enumerable: true, get: function () { return driverUtils_1.validateMessages; } });
14
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,yEAAoE;AAA3D,kIAAA,uBAAuB,OAAA;AAChC,iDAAoF;AAA3E,yGAAA,UAAU,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AAAE,+GAAA,gBAAgB,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { DocumentDeltaConnection } from \"./documentDeltaConnection\";\nexport { getW3CData, promiseRaceWithWinner, validateMessages } from \"./driverUtils\";\n"]}
package/dist/index.d.ts CHANGED
@@ -2,5 +2,6 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- export * from "./documentDeltaConnection";
5
+ export { DocumentDeltaConnection } from "./documentDeltaConnection";
6
+ export { getW3CData, promiseRaceWithWinner, validateMessages } from "./driverUtils";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
@@ -8,5 +8,5 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.pkgVersion = exports.pkgName = void 0;
10
10
  exports.pkgName = "@fluidframework/driver-base";
11
- exports.pkgVersion = "1.4.0-121020";
12
- //# sourceMappingURL=packageVersion.js.map
11
+ exports.pkgVersion = "2.0.0-dev-rc.1.0.0.225277";
12
+ //# sourceMappingURL=packageVersion.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageVersion.cjs","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,6BAA6B,CAAC;AACxC,QAAA,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/driver-base\";\nexport const pkgVersion = \"2.0.0-dev-rc.1.0.0.225277\";\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/driver-base";
8
- export declare const pkgVersion = "1.4.0-121020";
8
+ export declare const pkgVersion = "2.0.0-dev-rc.1.0.0.225277";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,gCAAgC,CAAC;AACrD,eAAO,MAAM,UAAU,iBAAiB,CAAC"}
1
+ {"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,gCAAgC,CAAC;AACrD,eAAO,MAAM,UAAU,8BAA8B,CAAC"}
@@ -0,0 +1,11 @@
1
+ // This file is read by tools that parse documentation comments conforming to the TSDoc standard.
2
+ // It should be published with your NPM package. It should not be tracked by Git.
3
+ {
4
+ "tsdocVersion": "0.12",
5
+ "toolPackages": [
6
+ {
7
+ "packageName": "@microsoft/api-extractor",
8
+ "packageVersion": "7.38.3"
9
+ }
10
+ ]
11
+ }
@@ -2,19 +2,20 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IDocumentDeltaConnection, IDocumentDeltaConnectionEvents } from "@fluidframework/driver-definitions";
6
- import { IAnyDriverError } from "@fluidframework/driver-utils";
5
+ import { IAnyDriverError, IDocumentDeltaConnection, IDocumentDeltaConnectionEvents } from "@fluidframework/driver-definitions";
7
6
  import { ConnectionMode, IClientConfiguration, IConnect, IConnected, IDocumentMessage, ISequencedDocumentMessage, ISignalClient, ISignalMessage, ITokenClaims } from "@fluidframework/protocol-definitions";
8
- import { IDisposable, ITelemetryLogger } from "@fluidframework/common-definitions";
9
- import { EventEmitterWithErrorHandling } from "@fluidframework/telemetry-utils";
7
+ import { IDisposable } from "@fluidframework/core-interfaces";
8
+ import { ITelemetryLoggerExt, EventEmitterWithErrorHandling } from "@fluidframework/telemetry-utils";
10
9
  import type { Socket } from "socket.io-client";
11
10
  /**
12
- * Represents a connection to a stream of delta updates
11
+ * Represents a connection to a stream of delta updates.
12
+ * @internal
13
13
  */
14
14
  export declare class DocumentDeltaConnection extends EventEmitterWithErrorHandling<IDocumentDeltaConnectionEvents> implements IDocumentDeltaConnection, IDisposable {
15
15
  protected readonly socket: Socket;
16
16
  documentId: string;
17
17
  private readonly enableLongPollingDowngrades;
18
+ protected readonly connectionId?: string | undefined;
18
19
  static readonly eventsToForward: string[];
19
20
  static readonly eventsAlwaysForwarded: string[];
20
21
  /**
@@ -34,6 +35,7 @@ export declare class DocumentDeltaConnection extends EventEmitterWithErrorHandli
34
35
  private earlyOpHandlerAttached;
35
36
  private socketConnectionTimeout;
36
37
  private _details;
38
+ private trackLatencyTimeout;
37
39
  private readonly connectionListeners;
38
40
  private readonly trackedListeners;
39
41
  protected get hasDetails(): boolean;
@@ -45,9 +47,9 @@ export declare class DocumentDeltaConnection extends EventEmitterWithErrorHandli
45
47
  protected _disposed: boolean;
46
48
  private readonly mc;
47
49
  /**
48
- * @deprecated - Implementors should manage their own logger or monitoring context
50
+ * @deprecated Implementors should manage their own logger or monitoring context
49
51
  */
50
- protected get logger(): ITelemetryLogger;
52
+ protected get logger(): ITelemetryLoggerExt;
51
53
  get details(): IConnected;
52
54
  /**
53
55
  * @param socket - websocket to be used
@@ -55,7 +57,7 @@ export declare class DocumentDeltaConnection extends EventEmitterWithErrorHandli
55
57
  * @param logger - for reporting telemetry events
56
58
  * @param enableLongPollingDowngrades - allow connection to be downgraded to long-polling on websocket failure
57
59
  */
58
- protected constructor(socket: Socket, documentId: string, logger: ITelemetryLogger, enableLongPollingDowngrades?: boolean);
60
+ protected constructor(socket: Socket, documentId: string, logger: ITelemetryLoggerExt, enableLongPollingDowngrades?: boolean, connectionId?: string | undefined);
59
61
  /**
60
62
  * Get the ID of the client who is sending the message
61
63
  *
@@ -94,7 +96,7 @@ export declare class DocumentDeltaConnection extends EventEmitterWithErrorHandli
94
96
  * Configuration details provided by the service
95
97
  */
96
98
  get serviceConfiguration(): IClientConfiguration;
97
- private checkNotClosed;
99
+ private checkNotDisposed;
98
100
  /**
99
101
  * Get messages sent during the connection
100
102
  *
@@ -114,7 +116,6 @@ export declare class DocumentDeltaConnection extends EventEmitterWithErrorHandli
114
116
  */
115
117
  get initialClients(): ISignalClient[];
116
118
  protected emitMessages(type: string, messages: IDocumentMessage[][]): void;
117
- protected submitCore(type: string, messages: IDocumentMessage[]): void;
118
119
  /**
119
120
  * Submits a new delta operation to the server
120
121
  *
@@ -124,33 +125,48 @@ export declare class DocumentDeltaConnection extends EventEmitterWithErrorHandli
124
125
  /**
125
126
  * Submits a new signal to the server
126
127
  *
127
- * @param message - signal to submit
128
+ * @param content - Content of the signal.
129
+ * @param targetClientId - When specified, the signal is only sent to the provided client id.
128
130
  */
129
- submitSignal(message: IDocumentMessage): void;
131
+ submitSignal(content: IDocumentMessage, targetClientId?: string): void;
130
132
  /**
131
- * Disconnect from the websocket, and permanently disable this DocumentDeltaConnection.
133
+ * Disconnect from the websocket and close the websocket too.
134
+ */
135
+ private closeSocket;
136
+ protected closeSocketCore(error: IAnyDriverError): void;
137
+ /**
138
+ * Disconnect from the websocket, and permanently disable this DocumentDeltaConnection and close the socket.
139
+ * However the OdspDocumentDeltaConnection differ in dispose as in there we don't close the socket. There is no
140
+ * multiplexing here, so we need to close the socket here.
132
141
  */
133
142
  dispose(): void;
134
- protected disposeCore(socketProtocolError: boolean, err: IAnyDriverError): void;
143
+ protected disconnect(err: IAnyDriverError): void;
135
144
  /**
136
145
  * Disconnect from the websocket.
137
- * @param socketProtocolError - true if error happened on socket / socket.io protocol level
138
- * (not on Fluid protocol level)
139
146
  * @param reason - reason for disconnect
140
147
  */
141
- protected disconnect(socketProtocolError: boolean, reason: IAnyDriverError): void;
148
+ protected disconnectCore(): void;
142
149
  protected initialize(connectMessage: IConnect, timeout: number): Promise<void>;
150
+ private addPropsToError;
151
+ protected getConnectionDetailsProps(): {
152
+ disposed: boolean;
153
+ socketConnected: boolean;
154
+ clientId: string | undefined;
155
+ connectionId: string | undefined;
156
+ };
143
157
  protected earlyOpHandler: (documentId: string, msgs: ISequencedDocumentMessage[]) => void;
144
- protected earlySignalHandler: (msg: ISignalMessage) => void;
158
+ protected earlySignalHandler: (msg: ISignalMessage | ISignalMessage[]) => void;
145
159
  private removeEarlyOpHandler;
146
160
  private removeEarlySignalHandler;
147
161
  private addConnectionListener;
148
162
  protected addTrackedListener(event: string, listener: (...args: any[]) => void): void;
149
163
  private removeTrackedListeners;
150
164
  private removeConnectionListeners;
165
+ private getErrorMessage;
166
+ private createErrorObjectWithProps;
151
167
  /**
152
168
  * Error raising for socket.io issues
153
169
  */
154
170
  protected createErrorObject(handler: string, error?: any, canRetry?: boolean): IAnyDriverError;
155
171
  }
156
- //# sourceMappingURL=documentDeltaConnection.d.ts.map
172
+ //# sourceMappingURL=documentDeltaConnection.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentDeltaConnection.d.mts","sourceRoot":"","sources":["../src/documentDeltaConnection.ts"],"names":[],"mappings":"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"}