@fluidframework/debugger 2.0.0-internal.3.0.1 → 2.0.0-internal.3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +9 -12
- package/README.md +33 -33
- package/api-extractor.json +2 -2
- package/dist/fluidDebugger.d.ts.map +1 -1
- package/dist/fluidDebugger.js.map +1 -1
- package/dist/fluidDebuggerController.d.ts.map +1 -1
- package/dist/fluidDebuggerController.js +5 -2
- package/dist/fluidDebuggerController.js.map +1 -1
- package/dist/fluidDebuggerUi.d.ts.map +1 -1
- package/dist/fluidDebuggerUi.js +11 -5
- package/dist/fluidDebuggerUi.js.map +1 -1
- package/dist/messageSchema.js.map +1 -1
- package/dist/sanitize.js.map +1 -1
- package/dist/sanitizer.d.ts.map +1 -1
- package/dist/sanitizer.js +9 -5
- package/dist/sanitizer.js.map +1 -1
- package/lib/fluidDebugger.d.ts.map +1 -1
- package/lib/fluidDebugger.js.map +1 -1
- package/lib/fluidDebuggerController.d.ts.map +1 -1
- package/lib/fluidDebuggerController.js +5 -2
- package/lib/fluidDebuggerController.js.map +1 -1
- package/lib/fluidDebuggerUi.d.ts.map +1 -1
- package/lib/fluidDebuggerUi.js +11 -5
- package/lib/fluidDebuggerUi.js.map +1 -1
- package/lib/messageSchema.js.map +1 -1
- package/lib/sanitize.js.map +1 -1
- package/lib/sanitizer.d.ts.map +1 -1
- package/lib/sanitizer.js +9 -5
- package/lib/sanitizer.js.map +1 -1
- package/package.json +68 -67
- package/prettier.config.cjs +1 -1
- package/src/fluidDebugger.ts +30 -30
- package/src/fluidDebuggerController.ts +348 -322
- package/src/fluidDebuggerUi.ts +306 -281
- package/src/messageSchema.ts +367 -367
- package/src/sanitize.ts +29 -29
- package/src/sanitizer.ts +699 -638
- package/tsconfig.esnext.json +6 -6
- package/tsconfig.json +10 -15
package/.eslintrc.js
CHANGED
|
@@ -4,15 +4,12 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
module.exports = {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"no-inner-declarations": "off",
|
|
17
|
-
}
|
|
18
|
-
}
|
|
7
|
+
extends: [require.resolve("@fluidframework/eslint-config-fluid/minimal"), "prettier"],
|
|
8
|
+
rules: {
|
|
9
|
+
"@typescript-eslint/no-non-null-assertion": "off",
|
|
10
|
+
"@typescript-eslint/no-use-before-define": "off",
|
|
11
|
+
"@typescript-eslint/strict-boolean-expressions": "off",
|
|
12
|
+
"import/no-nodejs-modules": "off",
|
|
13
|
+
"no-inner-declarations": "off",
|
|
14
|
+
},
|
|
15
|
+
};
|
package/README.md
CHANGED
|
@@ -2,64 +2,64 @@
|
|
|
2
2
|
|
|
3
3
|
Fluid Debugger is useful tool to replay file history. This can be useful as learning tool, as well as tool to investigate corruption or performance issues, or as content recovery tool. It provides read-only document and ability to start with a particular snapshot (or no snapshot at all), and play ops one by one, or in big batches.
|
|
4
4
|
|
|
5
|
-
Fluid Debugger works as an adapter on top of any document storage. In other words, it can be integrated into any app using any storage endpoint (like SPO or Routerlicious) with minimal changes to application and can be used to replay history with full app code running, thus helping investigating bugs in any layer of application stack
|
|
5
|
+
Fluid Debugger works as an adapter on top of any document storage. In other words, it can be integrated into any app using any storage endpoint (like SPO or Routerlicious) with minimal changes to application and can be used to replay history with full app code running, thus helping investigating bugs in any layer of application stack
|
|
6
6
|
|
|
7
|
-
## How to Enable it
|
|
7
|
+
## How to Enable it
|
|
8
8
|
|
|
9
9
|
In order to use it, these changes are required:
|
|
10
10
|
|
|
11
|
-
1. Wrap existing storage:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
2. In Dev Tools console, do
|
|
15
|
-
>
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
1. Wrap existing storage:
|
|
12
|
+
- If you have IDocumentService object, wrap it with **FluidDebugger.createFromService()** call (note that it's async call)
|
|
13
|
+
- Or, If you have IDocumentServiceFactory, wrap it with **FluidDebugger.createFromServiceFactory()** call
|
|
14
|
+
2. In Dev Tools console, do
|
|
15
|
+
> **localStorage.FluidDebugger = 1**
|
|
16
|
+
>
|
|
17
|
+
> > Fluid app has UI toggle for it - Settings | debbuger = on
|
|
18
|
+
3. Once you refresh page, look for blocked (by browser) pop-up window notification. Enable pop-ups for your app.
|
|
19
|
+
|
|
20
|
+
## How to disable it
|
|
18
21
|
|
|
19
|
-
## How to disable it ##
|
|
20
22
|
1. In Dev Tools console, run
|
|
21
|
-
>
|
|
23
|
+
> **delete localStorage.FluidDebugger**
|
|
22
24
|
|
|
23
|
-
## How it works
|
|
25
|
+
## How it works
|
|
24
26
|
|
|
25
|
-
### Selecting where to start
|
|
27
|
+
### Selecting where to start
|
|
26
28
|
|
|
27
|
-
Once debugger starts, you have the following choices on first screen:
|
|
29
|
+
Once debugger starts, you have the following choices on first screen:
|
|
28
30
|
|
|
29
31
|

|
|
30
32
|
|
|
31
|
-
1. Close window. Debugger will be disabled and normal document flow would proceed - document is read/write. In all other options document is read-only, i.e. no local changes are committed to storage.
|
|
33
|
+
1. Close window. Debugger will be disabled and normal document flow would proceed - document is read/write. In all other options document is read-only, i.e. no local changes are committed to storage.
|
|
32
34
|
|
|
33
|
-
2. Start with no snapshot, i.e. use only ops to play history of the file from start
|
|
35
|
+
2. Start with no snapshot, i.e. use only ops to play history of the file from start
|
|
34
36
|
|
|
35
|
-
3. Use a particular snapshot to start with (use dropdown). You will see a selection of snapshots (with cryptic names) as well as starting sequence number for each of them in dropdown, sorted (with latest at the top). Please note that dropdown is populated asynchronously - there is progress text on the page noting that.
|
|
37
|
+
3. Use a particular snapshot to start with (use dropdown). You will see a selection of snapshots (with cryptic names) as well as starting sequence number for each of them in dropdown, sorted (with latest at the top). Please note that dropdown is populated asynchronously - there is progress text on the page noting that.
|
|
36
38
|
|
|
37
|
-
4. Use snapshot stored on disk (_"snapshot.json"_), produced by [replay tool](../../tools/replay-tool/README.md). This option is useful if you want to validate that generation and loading of snapshot (from set of ops) does not introduce a bug. This is useful, given there is no other way to generate snapshot at particular point in time in the past. Notes:
|
|
38
|
-
- Currently you can't play ops on top of snapshot in this mode (to be added in the future).
|
|
39
|
-
- You can load snapshot from a different file (given above). As long as it's for same application, it does not matter if same file or storage endpoint is used to start an app.
|
|
39
|
+
4. Use snapshot stored on disk (_"snapshot.json"_), produced by [replay tool](../../tools/replay-tool/README.md). This option is useful if you want to validate that generation and loading of snapshot (from set of ops) does not introduce a bug. This is useful, given there is no other way to generate snapshot at particular point in time in the past. Notes:
|
|
40
|
+
- Currently you can't play ops on top of snapshot in this mode (to be added in the future).
|
|
41
|
+
- You can load snapshot from a different file (given above). As long as it's for same application, it does not matter if same file or storage endpoint is used to start an app.
|
|
40
42
|
|
|
41
|
-
### Playing ops
|
|
43
|
+
### Playing ops
|
|
42
44
|
|
|
43
|
-
If you chose storage snapshot (not snapshot from file) or no snapshot, you are presented with a screen that allows you to play ops (on top of snapshot). You can chose any number of ops to play at once and click "Go" button:
|
|
45
|
+
If you chose storage snapshot (not snapshot from file) or no snapshot, you are presented with a screen that allows you to play ops (on top of snapshot). You can chose any number of ops to play at once and click "Go" button:
|
|
44
46
|
|
|
45
47
|

|
|
46
48
|
|
|
47
|
-
Please note that playback is asynchronous, so even though Debugger UI might have acknowledged that ops where played out (and you can select next batch), application might be still in the process of processing previous batch.
|
|
49
|
+
Please note that playback is asynchronous, so even though Debugger UI might have acknowledged that ops where played out (and you can select next batch), application might be still in the process of processing previous batch.
|
|
48
50
|
|
|
49
|
-
## Internals, or useful piece to use in other workflows
|
|
51
|
+
## Internals, or useful piece to use in other workflows
|
|
50
52
|
|
|
51
53
|
Debugger consists of three mostly independent from each other pieces - UI, Controller & Storage layer. One can substitute UI and/or controller with alternative representation pretty easily, thus build different tool (like document recovery tool).
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
__IDebuggerUI__ is an interface that controls UI and has no control logic. __DebuggerUI__ is an implementation of that interface.
|
|
56
|
-
|
|
57
|
-
__FluidDebugger.createFluidDebugger()__ is an example of binding logic & UI implementations
|
|
55
|
+
**IDebuggerController** is an interface that controls replay logic, but not UI. An implementation of this interface is provided: **DebugReplayController**
|
|
58
56
|
|
|
59
|
-
|
|
57
|
+
**IDebuggerUI** is an interface that controls UI and has no control logic. **DebuggerUI** is an implementation of that interface.
|
|
60
58
|
|
|
61
|
-
|
|
62
|
-
2. __SnapshotStorage__ - storage based on particular snapshot (in real storage). Requires snapshots' root ISnapshotTree to be provided at construction time.
|
|
63
|
-
3. __OpStorage__ - op-based storage (i.e. it rejects all requests for snapshots / trees).
|
|
59
|
+
**FluidDebugger.createFluidDebugger()** is an example of binding logic & UI implementations
|
|
64
60
|
|
|
61
|
+
There are useful stand-alone implementations of **IDocumentStorageService** interface are provided as part of debugger:
|
|
65
62
|
|
|
63
|
+
1. **FileSnapshotReader** - file based storage. It reads content from file (snapshot.json) and expects **IFileSnapshot** format, uses content of such file to serve document requests.
|
|
64
|
+
2. **SnapshotStorage** - storage based on particular snapshot (in real storage). Requires snapshots' root ISnapshotTree to be provided at construction time.
|
|
65
|
+
3. **OpStorage** - op-based storage (i.e. it rejects all requests for snapshots / trees).
|
package/api-extractor.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
"$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
|
|
3
|
+
"extends": "@fluidframework/build-common/api-extractor-common-report.json"
|
|
4
4
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidDebugger.d.ts","sourceRoot":"","sources":["../src/fluidDebugger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC/F,OAAO,EAAyB,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAKpG,yBAAiB,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"fluidDebugger.d.ts","sourceRoot":"","sources":["../src/fluidDebugger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC/F,OAAO,EAAyB,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAKpG,yBAAiB,aAAa,CAAC;IAC9B;;;;;OAKG;IACH,SAAsB,iBAAiB,CACtC,eAAe,EAAE,gBAAgB,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CAM3B;IAED,SAAsB,wBAAwB,CAC7C,sBAAsB,EAAE,uBAAuB,mEAO/C;CAQD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidDebugger.js","sourceRoot":"","sources":["../src/fluidDebugger.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,iEAAoG;AACpG,uEAAkE;AAClE,uDAA+C;AAE/C,2DAA2D;AAC3D,IAAiB,aAAa,CAiC7B;AAjCD,WAAiB,aAAa;
|
|
1
|
+
{"version":3,"file":"fluidDebugger.js","sourceRoot":"","sources":["../src/fluidDebugger.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,iEAAoG;AACpG,uEAAkE;AAClE,uDAA+C;AAE/C,2DAA2D;AAC3D,IAAiB,aAAa,CAiC7B;AAjCD,WAAiB,aAAa;IAC7B;;;;;OAKG;IACI,KAAK,UAAU,iBAAiB,CACtC,eAAiC;QAEjC,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;QACzC,IAAI,CAAC,UAAU,EAAE;YAChB,OAAO,eAAe,CAAC;SACvB;QACD,OAAO,qCAAqB,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAClE,CAAC;IARqB,+BAAiB,oBAQtC,CAAA;IAEM,KAAK,UAAU,wBAAwB,CAC7C,sBAA+C;QAE/C,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;QACzC,IAAI,CAAC,UAAU,EAAE;YAChB,OAAO,sBAAsB,CAAC;SAC9B;QACD,OAAO,IAAI,4CAA4B,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;IAC7E,CAAC;IARqB,sCAAwB,2BAQ7C,CAAA;IAED;;;OAGG;IACH,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAChC,+CAAqB,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,4BAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9E,CAAC,EAjCgB,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAiC7B","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IDocumentService, IDocumentServiceFactory } from \"@fluidframework/driver-definitions\";\nimport { ReplayDocumentService, ReplayDocumentServiceFactory } from \"@fluidframework/replay-driver\";\nimport { DebugReplayController } from \"./fluidDebuggerController\";\nimport { DebuggerUI } from \"./fluidDebuggerUi\";\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace FluidDebugger {\n\t/**\n\t * Creates document service wrapper that pops up Debugger window and allows user to play ops one by one.\n\t * User can chose to start with any snapshot\n\t * If pop-ups are disabled, we continue without debugger.\n\t * @param documentService - original document service to use to fetch ops / snapshots.\n\t */\n\texport async function createFromService(\n\t\tdocumentService: IDocumentService,\n\t): Promise<IDocumentService> {\n\t\tconst controller = createFluidDebugger();\n\t\tif (!controller) {\n\t\t\treturn documentService;\n\t\t}\n\t\treturn ReplayDocumentService.create(documentService, controller);\n\t}\n\n\texport async function createFromServiceFactory(\n\t\tdocumentServiceFactory: IDocumentServiceFactory,\n\t) {\n\t\tconst controller = createFluidDebugger();\n\t\tif (!controller) {\n\t\t\treturn documentServiceFactory;\n\t\t}\n\t\treturn new ReplayDocumentServiceFactory(documentServiceFactory, controller);\n\t}\n\n\t/**\n\t * Binds DebuggerUI & DebugReplayController together\n\t * These classes do not know each other and talk through interfaces\n\t */\n\tconst createFluidDebugger = () =>\n\t\tDebugReplayController.create((controller) => DebuggerUI.create(controller));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidDebuggerController.d.ts","sourceRoot":"","sources":["../src/fluidDebuggerController.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAU,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"fluidDebuggerController.d.ts","sourceRoot":"","sources":["../src/fluidDebuggerController.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,7 +44,9 @@ class DebugReplayController extends replay_driver_1.ReplayController {
|
|
|
44
44
|
this.versionCount = 0;
|
|
45
45
|
}
|
|
46
46
|
static create(createUi) {
|
|
47
|
-
if (typeof localStorage === "object" &&
|
|
47
|
+
if (typeof localStorage === "object" &&
|
|
48
|
+
localStorage !== null &&
|
|
49
|
+
localStorage.FluidDebugger) {
|
|
48
50
|
const controller = new DebugReplayController();
|
|
49
51
|
const ui = createUi(controller);
|
|
50
52
|
if (ui) {
|
|
@@ -204,7 +206,8 @@ class DebugReplayController extends replay_driver_1.ReplayController {
|
|
|
204
206
|
this.ui.updateVersionText(0);
|
|
205
207
|
});
|
|
206
208
|
// This hangs until the user makes a selection or closes the window.
|
|
207
|
-
this.shouldUseController =
|
|
209
|
+
this.shouldUseController =
|
|
210
|
+
(await this.startSeqDeferred.promise) !== DebugReplayController.WindowClosedSeq;
|
|
208
211
|
(0, common_utils_1.assert)(this.isSelectionMade() === this.shouldUseController, 0x083 /* "User selection status does not match replay controller use status!" */);
|
|
209
212
|
return this.shouldUseController;
|
|
210
213
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidDebuggerController.js","sourceRoot":"","sources":["../src/fluidDebuggerController.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;AAEH,+DAAgE;AAMhE,+DAA4D;AAO5D,iEAMuC;AAEvC,2CAAwC;AAIxC;;GAEG;AACH,MAAa,qBAAsB,SAAQ,gCAAgB;IAA3D;;QA2Bc,OAAE,GAAgB,IAA0B,CAAC,CAAC,gDAAgD;QAE9F,qBAAgB,GAAG,IAAI,uBAAQ,EAAU,CAAC;QAEpD,kEAAkE;QACxD,6BAAwB,GAAG,KAAK,CAAC;QAIjC,aAAQ,GAAe,EAAE,CAAC;QAC1B,gBAAW,GAAW,CAAC,CAAC;QACxB,kBAAa,GAAG,KAAK,CAAC;QACtB,iBAAY,GAAG,CAAC,CAAC;IAgR/B,CAAC;IAtTU,MAAM,CAAC,MAAM,CAChB,QAA2B;QACnB,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,CAAC,aAAa,EAAE;YACjG,MAAM,UAAU,GAAG,IAAI,qBAAqB,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YAChC,IAAI,EAAE,EAAE;gBACJ,OAAO,UAAU,CAAC;aACrB;SACJ;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAIS,MAAM,CAAC,KAAK,CAAC,WAAW,CAC9B,sBAA+C,EAC/C,IAA0B;QAC1B,IAAI,CAAC,IAAI,EAAE;YACP,OAAO,CAAC,CAAC;SACZ;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAY,EAAsB,sBAAsB,EAAE,cAAc,CAAC,CAAC;QAC/F,OAAO,MAAM,CAAC,cAAc,CAAC;IACjC,CAAC;IAsBM,WAAW,CAAC,EAAe;QAC9B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC;IACzE,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,OAAiB;QAC7C,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAC9B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;SACrD;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;QACvF,IAAI,CAAC,cAAc,CACf,GAAG,EACH,IAAI,+BAAe,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,EACtD,OAAO,CAAC,CAAC;IACjB,CAAC;IAEM,eAAe,CAAC,KAAa;QAChC,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE;YACzD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SACrC;IACL,CAAC;IAEM,uBAAuB,CAAC,IAAU;QACrC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACtC,KAAK,CAAC,wBAAwB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3C,OAAO;SACV;QACD,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACjC,KAAK,CAAC,wDAAwD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3E,OAAO;SACV;QAED,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE;YACvB,IAAI,IAAI,CAAC,sBAAsB,EAAE;gBAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAgB,CAAC;gBACrC,IAAI;oBACA,MAAM,IAAI,GAAkB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC;oBAC9D;;;;;;;;;sBASE;oBACF,kEAAkE;oBAClE,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;oBACtC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;oBAC1B,IAAI,CAAC,cAAc,CACf,MAAM,CAAC,gBAAgB,EACvB,IAAI,kCAAkB,CAAC,IAAI,CAAC,EAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;iBAClB;gBAAC,OAAO,KAAK,EAAE;oBACZ,KAAK,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;oBACtC,OAAO;iBACV;aACJ;QACL,CAAC,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,wBAAwB,CAAC,SAAkB;QACpD,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE;YACpC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;SAC/C;QAED,MAAM,2BAA2B,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAAC;QACvF,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,2BAA2B,CAAC,CAAC;QAEhF,IAAI,SAAS,EAAE;YACX,MAAM,SAAS,GAAG,IAAI,qBAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YACrF,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;SACnC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,wBAAwB,CAAC,2BAA2B;;QAC9D,MAAM,cAAc,GAAG,yCAAyC,CAAC,2BAA2B,CAAC,CAAC;QAC9F,IAAI,QAAQ,GAAgC,EAAE,CAAC;;YAC/C,KAA4B,IAAA,mBAAA,cAAA,cAAc,CAAA,oBAAA;gBAA/B,MAAM,OAAO,2BAAA,CAAA;gBACpB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aACvC;;;;;;;;;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,OAAO,CAAC,SAAiB;QAC5B,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,2DAA2D;IACpD,eAAe;QAClB,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;IACtC,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC5B,sBAA+C,EAC/C,WAA0B,EAC1B,KAAa,EACb,OAAiB;QACjB,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YACxB,OAAO;SACV;QAED,MAAM,WAAW,CAAC;QAElB,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAEpF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;YACzB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7C,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;SAC/C;IACL,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,eAAiC;QACtD,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS,EAAE;YACxC,OAAO,IAAI,CAAC,mBAAmB,CAAC;SACnC;QAED,IAAA,qBAAM,EAAC,CAAC,CAAC,eAAe,EAAE,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACnE,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3E,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC1F,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,sBAAsB,GAAG,MAAM,eAAe,CAAC,gBAAgB,EAAE,CAAC;QAEvE,+CAA+C;QAC/C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;YACzB,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;gBACzB,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;aAChD;SACJ;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAEzC,+EAA+E;QAC/E,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,MAAM,IAAI,GAAoB,EAAE,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;YAC9B,IAAI,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YACpC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,OAAO,EAAE;gBAChE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACrC,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,sBAAsB,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;aACpG;YACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC1B;QAED,oCAAoC;QACpC,mEAAmE;QACnE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACxB,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,oEAAoE;QACpE,IAAI,CAAC,mBAAmB,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,KAAK,qBAAqB,CAAC,eAAe,CAAC;QAEzG,IAAA,qBAAM,EAAC,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,mBAAmB,EACtD,KAAK,CAAC,0EAA0E,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,MAAc;QAChC,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;YAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACxC;QACD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACrE,CAAC;IAEM,KAAK,CAAC,WAAW,CACpB,SAAwB,EACxB,KAAa;QACb,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;YAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;SACrD;QACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,gBAA2B;QACpD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;YAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;SACzD;QACD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC9E,CAAC;IAEM,KAAK,CAAC,qBAAqB;QAC9B,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;IACzC,CAAC;IAED;;OAEG;IACI,WAAW,CAAC,SAAiB,EAAE,aAAsB;QACxD,IAAI,aAAa,KAAK,SAAS,EAAE;YAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,SAAS,KAAK,MAAM,CAAC,gBAAgB,EAAE;gBACvC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;aACvC;iBAAM;gBACH,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;aAC9C;SACJ;aAAM;YACH,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;SAC7C;QACD,OAAO,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC;IAChE,CAAC;IAEM,KAAK,CAAC,MAAM,CACf,OAAkD,EAClD,UAAuC;QACvC,IAAI,WAAW,GAAG,UAAU,CAAC;QAC7B,iDAAiD;QACjD,OAAO,IAAI,EAAE;YACT,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC1B,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC7B,OAAO;aACV;YAED,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE;gBACxB,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,CAAC,aAAa,GAAG,IAAI,uBAAQ,EAAU,CAAC;gBAE5C,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBAEtC,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;gBAEpD,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBAC/B,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;aACrC;YAED,IAAI,OAAoC,CAAC;YACzC,IAAI,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,EAAE;gBACxC,OAAO,GAAG,WAAW,CAAC;gBACtB,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC;gBACvC,WAAW,GAAG,EAAE,CAAC;aACpB;iBAAM;gBACH,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAClD,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;aACxB;YACD,OAAO,CAAC,OAAO,CAAC,CAAC;SACpB;IACL,CAAC;IAES,cAAc,CACpB,GAAW,EACX,OAAuC,EACvC,OAA0B;QAC1B,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAChG,IAAA,qBAAM,EAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAA,qBAAM,EAAC,IAAI,CAAC,eAAe,EAAE,EAAE,KAAK,CAAC,iEAAiE,CAAC,CAAC;QAExG,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;;AAtTL,sDAuTC;AA1S6B,qCAAe,GAAG,CAAC,CAAC,CAAC,CAAC,2CAA2C;AA4S/F,SAAgB,yCAAyC,CAAC,YAA0C;;QAChG,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACxD,OAAO,IAAI,EAAE;YACT,MAAM,MAAM,GAAG,cAAM,MAAM,CAAC,IAAI,EAAE,CAAA,CAAC;YACnC,IAAI,MAAM,CAAC,IAAI,EAAE;gBACb,6BAAO;aACV;YACD,oBAAM,MAAM,CAAC,KAAK,CAAA,CAAC;SACtB;IACL,CAAC;CAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, Deferred } from \"@fluidframework/common-utils\";\nimport {\n IDocumentService,\n IDocumentStorageService,\n IDocumentDeltaStorageService,\n} from \"@fluidframework/driver-definitions\";\nimport { readAndParse } from \"@fluidframework/driver-utils\";\nimport {\n IDocumentAttributes,\n ISequencedDocumentMessage,\n ISnapshotTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n FileSnapshotReader,\n IFileSnapshot,\n ReadDocumentStorageServiceBase,\n ReplayController,\n SnapshotStorage,\n} from \"@fluidframework/replay-driver\";\nimport { IDebuggerController, IDebuggerUI } from \"./fluidDebuggerUi\";\nimport { Sanitizer } from \"./sanitizer\";\n\nexport type debuggerUIFactory = (controller: IDebuggerController) => IDebuggerUI | null;\n\n/**\n * Replay controller that uses pop-up window to control op playback\n */\nexport class DebugReplayController extends ReplayController implements IDebuggerController {\n public static create(\n createUi: debuggerUIFactory): DebugReplayController | null {\n if (typeof localStorage === \"object\" && localStorage !== null && localStorage.FluidDebugger) {\n const controller = new DebugReplayController();\n const ui = createUi(controller);\n if (ui) {\n return controller;\n }\n }\n return null;\n }\n\n protected static readonly WindowClosedSeq = -1; // Seq# to indicate that user closed window\n\n protected static async seqFromTree(\n documentStorageService: IDocumentStorageService,\n tree: ISnapshotTree | null): Promise<number> {\n if (!tree) {\n return 0;\n }\n\n const attributesHash = tree.trees[\".protocol\"].blobs.attributes;\n const attrib = await readAndParse<IDocumentAttributes>(documentStorageService, attributesHash);\n return attrib.sequenceNumber;\n }\n\n protected ui: IDebuggerUI = null as any as IDebuggerUI; // Not to check on every line that it's not null\n protected stepsDeferred?: Deferred<number>;\n protected startSeqDeferred = new Deferred<number>();\n\n // True will cause us ping server indefinitely waiting for new ops\n protected retryFetchOpsOnEndOfFile = false;\n\n protected documentService?: IDocumentService;\n protected documentStorageService?: IDocumentStorageService;\n protected versions: IVersion[] = [];\n protected stepsToPlay: number = 0;\n protected lastOpReached = false;\n protected versionCount = 0;\n\n protected storage?: ReadDocumentStorageServiceBase;\n\n // Member to prevent repeated initialization in initStorage(...), which also\n // returns if this controller should be used or function as a passthrough\n private shouldUseController: boolean | undefined;\n\n public connectToUi(ui: IDebuggerUI): void {\n this.ui = ui;\n }\n\n public onClose() {\n this.startSeqDeferred.resolve(DebugReplayController.WindowClosedSeq);\n }\n\n public async onVersionSelection(version: IVersion) {\n if (!this.documentStorageService) {\n throw new Error(\"onVersionSelection: no storage\");\n }\n\n const tree = await this.documentStorageService.getSnapshotTree(version);\n const seq = await DebugReplayController.seqFromTree(this.documentStorageService, tree);\n this.resolveStorage(\n seq,\n new SnapshotStorage(this.documentStorageService, tree),\n version);\n }\n\n public onOpButtonClick(steps: number) {\n if (this.stepsDeferred && !Number.isNaN(steps) && steps > 0) {\n this.stepsDeferred.resolve(steps);\n }\n }\n\n public onSnapshotFileSelection(file: File) {\n if (!/^snapshot.*\\.json/.exec(file.name)) {\n alert(`Incorrect file name: ${file.name}`);\n return;\n }\n if (/.*_expanded.*/.exec(file.name)) {\n alert(`Incorrect file name - please use non-extended files: ${file.name}`);\n return;\n }\n\n const reader = new FileReader();\n reader.onload = async () => {\n if (this.documentStorageService) {\n const text = reader.result as string;\n try {\n const json: IFileSnapshot = JSON.parse(text) as IFileSnapshot;\n /*\n Const docStorage = this.documentStorageService;\n const storage = {\n read: (blobId: string) => this.read(docStorage, blobId),\n };\n const seq = await DebugReplayController.seqFromTree(\n storage as IDocumentStorageService,\n tree);\n this.startSeqDeferred.resolve(seq);\n */\n // No ability to load ops, so just say - pick up from infinite op.\n this.retryFetchOpsOnEndOfFile = false;\n this.lastOpReached = true;\n this.resolveStorage(\n Number.MAX_SAFE_INTEGER,\n new FileSnapshotReader(json),\n file.name);\n } catch (error) {\n alert(`Error parsing file: ${error}`);\n return;\n }\n }\n };\n reader.readAsText(file, \"utf-8\");\n }\n\n public async onDownloadOpsButtonClick(anonymize: boolean): Promise<string> {\n if (this.documentService === undefined) {\n throw new Error(\"DocumentService required\");\n }\n\n const documentDeltaStorageService = await this.documentService.connectToDeltaStorage();\n let messages = await this.fetchOpsFromDeltaStorage(documentDeltaStorageService);\n\n if (anonymize) {\n const sanitizer = new Sanitizer(messages, false /* fullScrub */, false /* noBail */);\n messages = sanitizer.sanitize();\n }\n\n return JSON.stringify(messages, undefined, 2);\n }\n\n private async fetchOpsFromDeltaStorage(documentDeltaStorageService): Promise<ISequencedDocumentMessage[]> {\n const deltaGenerator = generateSequencedMessagesFromDeltaStorage(documentDeltaStorageService);\n let messages: ISequencedDocumentMessage[] = [];\n for await (const message of deltaGenerator) {\n messages = messages.concat(message);\n }\n return messages;\n }\n\n public fetchTo(currentOp: number): number | undefined {\n return undefined;\n }\n\n // Returns true if version / file / ops selections is made.\n public isSelectionMade() {\n return this.storage !== undefined;\n }\n\n public async downloadVersionInfo(\n documentStorageService: IDocumentStorageService,\n prevRequest: Promise<void>,\n index: number,\n version: IVersion): Promise<void> {\n if (this.isSelectionMade()) {\n return;\n }\n\n await prevRequest;\n\n const treeV = await documentStorageService.getSnapshotTree(version);\n const seqV = await DebugReplayController.seqFromTree(documentStorageService, treeV);\n\n if (!this.isSelectionMade()) {\n this.versionCount--;\n this.ui.updateVersionText(this.versionCount);\n this.ui.updateVersion(index, version, seqV);\n }\n }\n\n public async initStorage(documentService: IDocumentService): Promise<boolean> {\n if (this.shouldUseController !== undefined) {\n return this.shouldUseController;\n }\n\n assert(!!documentService, 0x080 /* \"Invalid document service!\" */);\n assert(!this.documentService, 0x081 /* \"Document service already set!\" */);\n assert(!this.documentStorageService, 0x082 /* \"Document storage service already set!\" */);\n this.documentService = documentService;\n this.documentStorageService = await documentService.connectToStorage();\n\n // User can chose \"file\" at any moment in time!\n if (!this.isSelectionMade()) {\n this.versions = await this.documentStorageService.getVersions(\"\", 50);\n if (!this.isSelectionMade()) {\n this.ui.addVersions(this.versions);\n this.ui.updateVersionText(this.versionCount);\n }\n }\n\n this.versionCount = this.versions.length;\n\n // Download all versions - do 10 downloads in parallel to avoid being throttled\n const buckets = 10;\n const work: Promise<void>[] = [];\n for (let i = 0; i < buckets; i++) {\n let prevRequest = Promise.resolve();\n for (let index = i; index < this.versions.length; index += buckets) {\n const version = this.versions[index];\n prevRequest = this.downloadVersionInfo(this.documentStorageService, prevRequest, index, version);\n }\n work.push(prevRequest);\n }\n\n // Don't wait for stuff to populate.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n Promise.all(work).then(() => {\n this.ui.updateVersionText(0);\n });\n\n // This hangs until the user makes a selection or closes the window.\n this.shouldUseController = await this.startSeqDeferred.promise !== DebugReplayController.WindowClosedSeq;\n\n assert(this.isSelectionMade() === this.shouldUseController,\n 0x083 /* \"User selection status does not match replay controller use status!\" */);\n return this.shouldUseController;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n if (this.storage !== undefined) {\n return this.storage.readBlob(blobId);\n }\n throw new Error(\"Reading blob before storage is setup properly\");\n }\n\n public async getVersions(\n versionId: string | null,\n count: number): Promise<IVersion[]> {\n if (this.storage !== undefined) {\n return this.storage.getVersions(versionId, count);\n }\n throw new Error(\"initStorage() was not called!\");\n }\n\n public async getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null> {\n if (this.storage !== undefined) {\n return this.storage.getSnapshotTree(versionRequested);\n }\n throw new Error(\"Reading snapshot tree before storage is setup properly\");\n }\n\n public async getStartingOpSequence() {\n return this.startSeqDeferred.promise;\n }\n\n /**\n * Return true if we are done processing ops\n */\n public isDoneFetch(currentOp: number, lastTimeStamp?: number): boolean {\n if (lastTimeStamp === undefined) {\n this.lastOpReached = true;\n if (currentOp === Number.MAX_SAFE_INTEGER) {\n this.ui.updateLastOpText(-1, false);\n } else {\n this.ui.updateLastOpText(currentOp, false);\n }\n } else {\n this.ui.updateLastOpText(currentOp, true);\n }\n return this.lastOpReached && !this.retryFetchOpsOnEndOfFile;\n }\n\n public async replay(\n emitter: (op: ISequencedDocumentMessage[]) => void,\n fetchedOps: ISequencedDocumentMessage[]): Promise<void> {\n let _fetchedOps = fetchedOps;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (_fetchedOps.length === 0) {\n this.ui.updateNextOpText([]);\n return;\n }\n\n if (this.stepsToPlay === 0) {\n this.ui.disableNextOpButton(false);\n this.stepsDeferred = new Deferred<number>();\n\n this.ui.updateNextOpText(_fetchedOps);\n\n this.stepsToPlay = await this.stepsDeferred.promise;\n\n this.stepsDeferred = undefined;\n this.ui.disableNextOpButton(true);\n }\n\n let playOps: ISequencedDocumentMessage[];\n if (this.stepsToPlay >= _fetchedOps.length) {\n playOps = _fetchedOps;\n this.stepsToPlay -= _fetchedOps.length;\n _fetchedOps = [];\n } else {\n playOps = _fetchedOps.splice(0, this.stepsToPlay);\n this.stepsToPlay = 0;\n }\n emitter(playOps);\n }\n }\n\n protected resolveStorage(\n seq: number,\n storage: ReadDocumentStorageServiceBase,\n version: IVersion | string) {\n assert(!this.isSelectionMade(), 0x084 /* \"On storage resolve, user selection already made!\" */);\n assert(!!storage, 0x085 /* \"On storage resolve, missing storage!\" */);\n this.storage = storage;\n assert(this.isSelectionMade(), 0x086 /* \"After storage resolve, user selection status still false!\" */);\n\n this.ui.versionSelected(seq, version);\n this.startSeqDeferred.resolve(seq);\n }\n}\n\nasync function* generateSequencedMessagesFromDeltaStorage(deltaStorage: IDocumentDeltaStorageService) {\n const stream = deltaStorage.fetchMessages(1, undefined);\n while (true) {\n const result = await stream.read();\n if (result.done) {\n return;\n }\n yield result.value;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fluidDebuggerController.js","sourceRoot":"","sources":["../src/fluidDebuggerController.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;AAEH,+DAAgE;AAMhE,+DAA4D;AAO5D,iEAMuC;AAEvC,2CAAwC;AAIxC;;GAEG;AACH,MAAa,qBAAsB,SAAQ,gCAAgB;IAA3D;;QAkCW,OAAE,GAAgB,IAA0B,CAAC,CAAC,gDAAgD;QAE9F,qBAAgB,GAAG,IAAI,uBAAQ,EAAU,CAAC;QAEpD,kEAAkE;QACxD,6BAAwB,GAAG,KAAK,CAAC;QAIjC,aAAQ,GAAe,EAAE,CAAC;QAC1B,gBAAW,GAAW,CAAC,CAAC;QACxB,kBAAa,GAAG,KAAK,CAAC;QACtB,iBAAY,GAAG,CAAC,CAAC;IAiS5B,CAAC;IA9UO,MAAM,CAAC,MAAM,CAAC,QAA2B;QAC/C,IACC,OAAO,YAAY,KAAK,QAAQ;YAChC,YAAY,KAAK,IAAI;YACrB,YAAY,CAAC,aAAa,EACzB;YACD,MAAM,UAAU,GAAG,IAAI,qBAAqB,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YAChC,IAAI,EAAE,EAAE;gBACP,OAAO,UAAU,CAAC;aAClB;SACD;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAIS,MAAM,CAAC,KAAK,CAAC,WAAW,CACjC,sBAA+C,EAC/C,IAA0B;QAE1B,IAAI,CAAC,IAAI,EAAE;YACV,OAAO,CAAC,CAAC;SACT;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAY,EAChC,sBAAsB,EACtB,cAAc,CACd,CAAC;QACF,OAAO,MAAM,CAAC,cAAc,CAAC;IAC9B,CAAC;IAsBM,WAAW,CAAC,EAAe;QACjC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,CAAC;IAEM,OAAO;QACb,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC;IACtE,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,OAAiB;QAChD,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;SAClD;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;QACvF,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,+BAAe,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3F,CAAC;IAEM,eAAe,CAAC,KAAa;QACnC,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE;YAC5D,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAClC;IACF,CAAC;IAEM,uBAAuB,CAAC,IAAU;QACxC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACzC,KAAK,CAAC,wBAAwB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3C,OAAO;SACP;QACD,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACpC,KAAK,CAAC,wDAAwD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3E,OAAO;SACP;QAED,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE;YAC1B,IAAI,IAAI,CAAC,sBAAsB,EAAE;gBAChC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAgB,CAAC;gBACrC,IAAI;oBACH,MAAM,IAAI,GAAkB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC;oBAC9D;;;;;;;;;sBASiB;oBACjB,kEAAkE;oBAClE,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;oBACtC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;oBAC1B,IAAI,CAAC,cAAc,CAClB,MAAM,CAAC,gBAAgB,EACvB,IAAI,kCAAkB,CAAC,IAAI,CAAC,EAC5B,IAAI,CAAC,IAAI,CACT,CAAC;iBACF;gBAAC,OAAO,KAAK,EAAE;oBACf,KAAK,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;oBACtC,OAAO;iBACP;aACD;QACF,CAAC,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,wBAAwB,CAAC,SAAkB;QACvD,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;SAC5C;QAED,MAAM,2BAA2B,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAAC;QACvF,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,2BAA2B,CAAC,CAAC;QAEhF,IAAI,SAAS,EAAE;YACd,MAAM,SAAS,GAAG,IAAI,qBAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YACrF,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;SAChC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAEO,KAAK,CAAC,wBAAwB,CACrC,2BAA2B;;QAE3B,MAAM,cAAc,GAAG,yCAAyC,CAC/D,2BAA2B,CAC3B,CAAC;QACF,IAAI,QAAQ,GAAgC,EAAE,CAAC;;YAC/C,KAA4B,IAAA,mBAAA,cAAA,cAAc,CAAA,oBAAA;gBAA/B,MAAM,OAAO,2BAAA,CAAA;gBACvB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aACpC;;;;;;;;;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAEM,OAAO,CAAC,SAAiB;QAC/B,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,2DAA2D;IACpD,eAAe;QACrB,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;IACnC,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC/B,sBAA+C,EAC/C,WAA0B,EAC1B,KAAa,EACb,OAAiB;QAEjB,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC3B,OAAO;SACP;QAED,MAAM,WAAW,CAAC;QAElB,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAEpF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;YAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7C,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;SAC5C;IACF,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,eAAiC;QACzD,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS,EAAE;YAC3C,OAAO,IAAI,CAAC,mBAAmB,CAAC;SAChC;QAED,IAAA,qBAAM,EAAC,CAAC,CAAC,eAAe,EAAE,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACnE,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3E,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC1F,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,sBAAsB,GAAG,MAAM,eAAe,CAAC,gBAAgB,EAAE,CAAC;QAEvE,+CAA+C;QAC/C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;YAC5B,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;gBAC5B,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;aAC7C;SACD;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAEzC,+EAA+E;QAC/E,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,MAAM,IAAI,GAAoB,EAAE,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;YACjC,IAAI,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YACpC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,OAAO,EAAE;gBACnE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACrC,WAAW,GAAG,IAAI,CAAC,mBAAmB,CACrC,IAAI,CAAC,sBAAsB,EAC3B,WAAW,EACX,KAAK,EACL,OAAO,CACP,CAAC;aACF;YACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SACvB;QAED,oCAAoC;QACpC,mEAAmE;QACnE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YAC3B,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,oEAAoE;QACpE,IAAI,CAAC,mBAAmB;YACvB,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,qBAAqB,CAAC,eAAe,CAAC;QAEjF,IAAA,qBAAM,EACL,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,mBAAmB,EACnD,KAAK,CAAC,0EAA0E,CAChF,CAAC;QACF,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,MAAc;QACnC,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;YAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACrC;QACD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAClE,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,SAAwB,EAAE,KAAa;QAC/D,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;YAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;SAClD;QACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,gBAA2B;QACvD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;YAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;SACtD;QACD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC3E,CAAC;IAEM,KAAK,CAAC,qBAAqB;QACjC,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;IACtC,CAAC;IAED;;OAEG;IACI,WAAW,CAAC,SAAiB,EAAE,aAAsB;QAC3D,IAAI,aAAa,KAAK,SAAS,EAAE;YAChC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,SAAS,KAAK,MAAM,CAAC,gBAAgB,EAAE;gBAC1C,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;aACpC;iBAAM;gBACN,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;aAC3C;SACD;aAAM;YACN,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;SAC1C;QACD,OAAO,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC;IAC7D,CAAC;IAEM,KAAK,CAAC,MAAM,CAClB,OAAkD,EAClD,UAAuC;QAEvC,IAAI,WAAW,GAAG,UAAU,CAAC;QAC7B,iDAAiD;QACjD,OAAO,IAAI,EAAE;YACZ,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7B,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC7B,OAAO;aACP;YAED,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE;gBAC3B,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,CAAC,aAAa,GAAG,IAAI,uBAAQ,EAAU,CAAC;gBAE5C,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBAEtC,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;gBAEpD,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBAC/B,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;aAClC;YAED,IAAI,OAAoC,CAAC;YACzC,IAAI,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,EAAE;gBAC3C,OAAO,GAAG,WAAW,CAAC;gBACtB,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC;gBACvC,WAAW,GAAG,EAAE,CAAC;aACjB;iBAAM;gBACN,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAClD,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;aACrB;YACD,OAAO,CAAC,OAAO,CAAC,CAAC;SACjB;IACF,CAAC;IAES,cAAc,CACvB,GAAW,EACX,OAAuC,EACvC,OAA0B;QAE1B,IAAA,qBAAM,EACL,CAAC,IAAI,CAAC,eAAe,EAAE,EACvB,KAAK,CAAC,wDAAwD,CAC9D,CAAC;QACF,IAAA,qBAAM,EAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAA,qBAAM,EACL,IAAI,CAAC,eAAe,EAAE,EACtB,KAAK,CAAC,iEAAiE,CACvE,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;;AA9UF,sDA+UC;AA/T0B,qCAAe,GAAG,CAAC,CAAC,CAAC,CAAC,2CAA2C;AAiU5F,SAAgB,yCAAyC,CACxD,YAA0C;;QAE1C,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACxD,OAAO,IAAI,EAAE;YACZ,MAAM,MAAM,GAAG,cAAM,MAAM,CAAC,IAAI,EAAE,CAAA,CAAC;YACnC,IAAI,MAAM,CAAC,IAAI,EAAE;gBAChB,6BAAO;aACP;YACD,oBAAM,MAAM,CAAC,KAAK,CAAA,CAAC;SACnB;IACF,CAAC;CAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, Deferred } from \"@fluidframework/common-utils\";\nimport {\n\tIDocumentService,\n\tIDocumentStorageService,\n\tIDocumentDeltaStorageService,\n} from \"@fluidframework/driver-definitions\";\nimport { readAndParse } from \"@fluidframework/driver-utils\";\nimport {\n\tIDocumentAttributes,\n\tISequencedDocumentMessage,\n\tISnapshotTree,\n\tIVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tFileSnapshotReader,\n\tIFileSnapshot,\n\tReadDocumentStorageServiceBase,\n\tReplayController,\n\tSnapshotStorage,\n} from \"@fluidframework/replay-driver\";\nimport { IDebuggerController, IDebuggerUI } from \"./fluidDebuggerUi\";\nimport { Sanitizer } from \"./sanitizer\";\n\nexport type debuggerUIFactory = (controller: IDebuggerController) => IDebuggerUI | null;\n\n/**\n * Replay controller that uses pop-up window to control op playback\n */\nexport class DebugReplayController extends ReplayController implements IDebuggerController {\n\tpublic static create(createUi: debuggerUIFactory): DebugReplayController | null {\n\t\tif (\n\t\t\ttypeof localStorage === \"object\" &&\n\t\t\tlocalStorage !== null &&\n\t\t\tlocalStorage.FluidDebugger\n\t\t) {\n\t\t\tconst controller = new DebugReplayController();\n\t\t\tconst ui = createUi(controller);\n\t\t\tif (ui) {\n\t\t\t\treturn controller;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprotected static readonly WindowClosedSeq = -1; // Seq# to indicate that user closed window\n\n\tprotected static async seqFromTree(\n\t\tdocumentStorageService: IDocumentStorageService,\n\t\ttree: ISnapshotTree | null,\n\t): Promise<number> {\n\t\tif (!tree) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst attributesHash = tree.trees[\".protocol\"].blobs.attributes;\n\t\tconst attrib = await readAndParse<IDocumentAttributes>(\n\t\t\tdocumentStorageService,\n\t\t\tattributesHash,\n\t\t);\n\t\treturn attrib.sequenceNumber;\n\t}\n\n\tprotected ui: IDebuggerUI = null as any as IDebuggerUI; // Not to check on every line that it's not null\n\tprotected stepsDeferred?: Deferred<number>;\n\tprotected startSeqDeferred = new Deferred<number>();\n\n\t// True will cause us ping server indefinitely waiting for new ops\n\tprotected retryFetchOpsOnEndOfFile = false;\n\n\tprotected documentService?: IDocumentService;\n\tprotected documentStorageService?: IDocumentStorageService;\n\tprotected versions: IVersion[] = [];\n\tprotected stepsToPlay: number = 0;\n\tprotected lastOpReached = false;\n\tprotected versionCount = 0;\n\n\tprotected storage?: ReadDocumentStorageServiceBase;\n\n\t// Member to prevent repeated initialization in initStorage(...), which also\n\t// returns if this controller should be used or function as a passthrough\n\tprivate shouldUseController: boolean | undefined;\n\n\tpublic connectToUi(ui: IDebuggerUI): void {\n\t\tthis.ui = ui;\n\t}\n\n\tpublic onClose() {\n\t\tthis.startSeqDeferred.resolve(DebugReplayController.WindowClosedSeq);\n\t}\n\n\tpublic async onVersionSelection(version: IVersion) {\n\t\tif (!this.documentStorageService) {\n\t\t\tthrow new Error(\"onVersionSelection: no storage\");\n\t\t}\n\n\t\tconst tree = await this.documentStorageService.getSnapshotTree(version);\n\t\tconst seq = await DebugReplayController.seqFromTree(this.documentStorageService, tree);\n\t\tthis.resolveStorage(seq, new SnapshotStorage(this.documentStorageService, tree), version);\n\t}\n\n\tpublic onOpButtonClick(steps: number) {\n\t\tif (this.stepsDeferred && !Number.isNaN(steps) && steps > 0) {\n\t\t\tthis.stepsDeferred.resolve(steps);\n\t\t}\n\t}\n\n\tpublic onSnapshotFileSelection(file: File) {\n\t\tif (!/^snapshot.*\\.json/.exec(file.name)) {\n\t\t\talert(`Incorrect file name: ${file.name}`);\n\t\t\treturn;\n\t\t}\n\t\tif (/.*_expanded.*/.exec(file.name)) {\n\t\t\talert(`Incorrect file name - please use non-extended files: ${file.name}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst reader = new FileReader();\n\t\treader.onload = async () => {\n\t\t\tif (this.documentStorageService) {\n\t\t\t\tconst text = reader.result as string;\n\t\t\t\ttry {\n\t\t\t\t\tconst json: IFileSnapshot = JSON.parse(text) as IFileSnapshot;\n\t\t\t\t\t/*\n Const docStorage = this.documentStorageService;\n const storage = {\n read: (blobId: string) => this.read(docStorage, blobId),\n };\n const seq = await DebugReplayController.seqFromTree(\n storage as IDocumentStorageService,\n tree);\n this.startSeqDeferred.resolve(seq);\n */\n\t\t\t\t\t// No ability to load ops, so just say - pick up from infinite op.\n\t\t\t\t\tthis.retryFetchOpsOnEndOfFile = false;\n\t\t\t\t\tthis.lastOpReached = true;\n\t\t\t\t\tthis.resolveStorage(\n\t\t\t\t\t\tNumber.MAX_SAFE_INTEGER,\n\t\t\t\t\t\tnew FileSnapshotReader(json),\n\t\t\t\t\t\tfile.name,\n\t\t\t\t\t);\n\t\t\t\t} catch (error) {\n\t\t\t\t\talert(`Error parsing file: ${error}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treader.readAsText(file, \"utf-8\");\n\t}\n\n\tpublic async onDownloadOpsButtonClick(anonymize: boolean): Promise<string> {\n\t\tif (this.documentService === undefined) {\n\t\t\tthrow new Error(\"DocumentService required\");\n\t\t}\n\n\t\tconst documentDeltaStorageService = await this.documentService.connectToDeltaStorage();\n\t\tlet messages = await this.fetchOpsFromDeltaStorage(documentDeltaStorageService);\n\n\t\tif (anonymize) {\n\t\t\tconst sanitizer = new Sanitizer(messages, false /* fullScrub */, false /* noBail */);\n\t\t\tmessages = sanitizer.sanitize();\n\t\t}\n\n\t\treturn JSON.stringify(messages, undefined, 2);\n\t}\n\n\tprivate async fetchOpsFromDeltaStorage(\n\t\tdocumentDeltaStorageService,\n\t): Promise<ISequencedDocumentMessage[]> {\n\t\tconst deltaGenerator = generateSequencedMessagesFromDeltaStorage(\n\t\t\tdocumentDeltaStorageService,\n\t\t);\n\t\tlet messages: ISequencedDocumentMessage[] = [];\n\t\tfor await (const message of deltaGenerator) {\n\t\t\tmessages = messages.concat(message);\n\t\t}\n\t\treturn messages;\n\t}\n\n\tpublic fetchTo(currentOp: number): number | undefined {\n\t\treturn undefined;\n\t}\n\n\t// Returns true if version / file / ops selections is made.\n\tpublic isSelectionMade() {\n\t\treturn this.storage !== undefined;\n\t}\n\n\tpublic async downloadVersionInfo(\n\t\tdocumentStorageService: IDocumentStorageService,\n\t\tprevRequest: Promise<void>,\n\t\tindex: number,\n\t\tversion: IVersion,\n\t): Promise<void> {\n\t\tif (this.isSelectionMade()) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait prevRequest;\n\n\t\tconst treeV = await documentStorageService.getSnapshotTree(version);\n\t\tconst seqV = await DebugReplayController.seqFromTree(documentStorageService, treeV);\n\n\t\tif (!this.isSelectionMade()) {\n\t\t\tthis.versionCount--;\n\t\t\tthis.ui.updateVersionText(this.versionCount);\n\t\t\tthis.ui.updateVersion(index, version, seqV);\n\t\t}\n\t}\n\n\tpublic async initStorage(documentService: IDocumentService): Promise<boolean> {\n\t\tif (this.shouldUseController !== undefined) {\n\t\t\treturn this.shouldUseController;\n\t\t}\n\n\t\tassert(!!documentService, 0x080 /* \"Invalid document service!\" */);\n\t\tassert(!this.documentService, 0x081 /* \"Document service already set!\" */);\n\t\tassert(!this.documentStorageService, 0x082 /* \"Document storage service already set!\" */);\n\t\tthis.documentService = documentService;\n\t\tthis.documentStorageService = await documentService.connectToStorage();\n\n\t\t// User can chose \"file\" at any moment in time!\n\t\tif (!this.isSelectionMade()) {\n\t\t\tthis.versions = await this.documentStorageService.getVersions(\"\", 50);\n\t\t\tif (!this.isSelectionMade()) {\n\t\t\t\tthis.ui.addVersions(this.versions);\n\t\t\t\tthis.ui.updateVersionText(this.versionCount);\n\t\t\t}\n\t\t}\n\n\t\tthis.versionCount = this.versions.length;\n\n\t\t// Download all versions - do 10 downloads in parallel to avoid being throttled\n\t\tconst buckets = 10;\n\t\tconst work: Promise<void>[] = [];\n\t\tfor (let i = 0; i < buckets; i++) {\n\t\t\tlet prevRequest = Promise.resolve();\n\t\t\tfor (let index = i; index < this.versions.length; index += buckets) {\n\t\t\t\tconst version = this.versions[index];\n\t\t\t\tprevRequest = this.downloadVersionInfo(\n\t\t\t\t\tthis.documentStorageService,\n\t\t\t\t\tprevRequest,\n\t\t\t\t\tindex,\n\t\t\t\t\tversion,\n\t\t\t\t);\n\t\t\t}\n\t\t\twork.push(prevRequest);\n\t\t}\n\n\t\t// Don't wait for stuff to populate.\n\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\tPromise.all(work).then(() => {\n\t\t\tthis.ui.updateVersionText(0);\n\t\t});\n\n\t\t// This hangs until the user makes a selection or closes the window.\n\t\tthis.shouldUseController =\n\t\t\t(await this.startSeqDeferred.promise) !== DebugReplayController.WindowClosedSeq;\n\n\t\tassert(\n\t\t\tthis.isSelectionMade() === this.shouldUseController,\n\t\t\t0x083 /* \"User selection status does not match replay controller use status!\" */,\n\t\t);\n\t\treturn this.shouldUseController;\n\t}\n\n\tpublic async readBlob(blobId: string): Promise<ArrayBufferLike> {\n\t\tif (this.storage !== undefined) {\n\t\t\treturn this.storage.readBlob(blobId);\n\t\t}\n\t\tthrow new Error(\"Reading blob before storage is setup properly\");\n\t}\n\n\tpublic async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n\t\tif (this.storage !== undefined) {\n\t\t\treturn this.storage.getVersions(versionId, count);\n\t\t}\n\t\tthrow new Error(\"initStorage() was not called!\");\n\t}\n\n\tpublic async getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null> {\n\t\tif (this.storage !== undefined) {\n\t\t\treturn this.storage.getSnapshotTree(versionRequested);\n\t\t}\n\t\tthrow new Error(\"Reading snapshot tree before storage is setup properly\");\n\t}\n\n\tpublic async getStartingOpSequence() {\n\t\treturn this.startSeqDeferred.promise;\n\t}\n\n\t/**\n\t * Return true if we are done processing ops\n\t */\n\tpublic isDoneFetch(currentOp: number, lastTimeStamp?: number): boolean {\n\t\tif (lastTimeStamp === undefined) {\n\t\t\tthis.lastOpReached = true;\n\t\t\tif (currentOp === Number.MAX_SAFE_INTEGER) {\n\t\t\t\tthis.ui.updateLastOpText(-1, false);\n\t\t\t} else {\n\t\t\t\tthis.ui.updateLastOpText(currentOp, false);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.ui.updateLastOpText(currentOp, true);\n\t\t}\n\t\treturn this.lastOpReached && !this.retryFetchOpsOnEndOfFile;\n\t}\n\n\tpublic async replay(\n\t\temitter: (op: ISequencedDocumentMessage[]) => void,\n\t\tfetchedOps: ISequencedDocumentMessage[],\n\t): Promise<void> {\n\t\tlet _fetchedOps = fetchedOps;\n\t\t// eslint-disable-next-line no-constant-condition\n\t\twhile (true) {\n\t\t\tif (_fetchedOps.length === 0) {\n\t\t\t\tthis.ui.updateNextOpText([]);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.stepsToPlay === 0) {\n\t\t\t\tthis.ui.disableNextOpButton(false);\n\t\t\t\tthis.stepsDeferred = new Deferred<number>();\n\n\t\t\t\tthis.ui.updateNextOpText(_fetchedOps);\n\n\t\t\t\tthis.stepsToPlay = await this.stepsDeferred.promise;\n\n\t\t\t\tthis.stepsDeferred = undefined;\n\t\t\t\tthis.ui.disableNextOpButton(true);\n\t\t\t}\n\n\t\t\tlet playOps: ISequencedDocumentMessage[];\n\t\t\tif (this.stepsToPlay >= _fetchedOps.length) {\n\t\t\t\tplayOps = _fetchedOps;\n\t\t\t\tthis.stepsToPlay -= _fetchedOps.length;\n\t\t\t\t_fetchedOps = [];\n\t\t\t} else {\n\t\t\t\tplayOps = _fetchedOps.splice(0, this.stepsToPlay);\n\t\t\t\tthis.stepsToPlay = 0;\n\t\t\t}\n\t\t\temitter(playOps);\n\t\t}\n\t}\n\n\tprotected resolveStorage(\n\t\tseq: number,\n\t\tstorage: ReadDocumentStorageServiceBase,\n\t\tversion: IVersion | string,\n\t) {\n\t\tassert(\n\t\t\t!this.isSelectionMade(),\n\t\t\t0x084 /* \"On storage resolve, user selection already made!\" */,\n\t\t);\n\t\tassert(!!storage, 0x085 /* \"On storage resolve, missing storage!\" */);\n\t\tthis.storage = storage;\n\t\tassert(\n\t\t\tthis.isSelectionMade(),\n\t\t\t0x086 /* \"After storage resolve, user selection status still false!\" */,\n\t\t);\n\n\t\tthis.ui.versionSelected(seq, version);\n\t\tthis.startSeqDeferred.resolve(seq);\n\t}\n}\n\nasync function* generateSequencedMessagesFromDeltaStorage(\n\tdeltaStorage: IDocumentDeltaStorageService,\n) {\n\tconst stream = deltaStorage.fetchMessages(1, undefined);\n\twhile (true) {\n\t\tconst result = await stream.read();\n\t\tif (result.done) {\n\t\t\treturn;\n\t\t}\n\t\tyield result.value;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidDebuggerUi.d.ts","sourceRoot":"","sources":["../src/fluidDebuggerUi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAE3F,MAAM,WAAW,WAAW;
|
|
1
|
+
{"version":3,"file":"fluidDebuggerUi.d.ts","sourceRoot":"","sources":["../src/fluidDebuggerUi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAE3F,MAAM,WAAW,WAAW;IAC3B;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAEvC;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzE;;;;;;;;OAQG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;IAErE;;;OAGG;IACH,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAE5C;;;;OAIG;IACH,gBAAgB,CAAC,GAAG,EAAE,yBAAyB,EAAE,GAAG,IAAI,CAAC;IAEzD;;OAEG;IACH,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9C;;;;OAIG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;CACnE;AAED,MAAM,WAAW,mBAAmB;IACnC;;;OAGG;IACH,WAAW,CAAC,EAAE,EAAE,WAAW,OAAE;IAE7B;;;;OAIG;IACH,OAAO,IAAI,IAAI,CAAC;IAEhB;;;;OAIG;IACH,kBAAkB,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAE5C;;;;OAIG;IACH,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAE1C;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAErC;;;OAGG;IACH,wBAAwB,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D;AAqCD,qBAAa,UAAU;IAiDrB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc;WAjDlB,MAAM,CAAC,UAAU,EAAE,mBAAmB,GAAG,UAAU,GAAG,IAAI;IA0BxE,OAAO,CAAC,MAAM,CAAC,UAAU;IAQzB,SAAS,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IACvC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC;IAEtC,SAAS,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC;IACxC,SAAS,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IACjC,SAAS,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IACjC,SAAS,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IACjC,SAAS,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC;IACtC,SAAS,CAAC,kBAAkB,UAAS;IACrC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAM;IAEpC,SAAS,CAAC,cAAc,UAAS;IAEjC,SAAS,aACS,UAAU,EAAE,mBAAmB,EAC/B,cAAc,EAAE,MAAM;IAsDxC,OAAO,CAAC,yBAAyB;IAa1B,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE;IAchC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM;IAQjE,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM;IAkC7D,mBAAmB,CAAC,OAAO,EAAE,OAAO;IAKpC,gBAAgB,CAAC,GAAG,EAAE,yBAAyB,EAAE;IAejD,iBAAiB,CAAC,YAAY,EAAE,MAAM;IAQtC,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO;IAOlE,OAAO,CAAC,QAAQ;CAYhB"}
|
package/dist/fluidDebuggerUi.js
CHANGED
|
@@ -101,9 +101,14 @@ class DebuggerUI {
|
|
|
101
101
|
}
|
|
102
102
|
attachDownloadOpsListener(element, anonymize) {
|
|
103
103
|
element.addEventListener("click", () => {
|
|
104
|
-
this.controller
|
|
104
|
+
this.controller
|
|
105
|
+
.onDownloadOpsButtonClick(anonymize.checked)
|
|
106
|
+
.then((opJson) => {
|
|
105
107
|
this.download("opStream.json", opJson);
|
|
106
|
-
})
|
|
108
|
+
})
|
|
109
|
+
.catch((error) => {
|
|
110
|
+
console.log(`Error downloading ops: ${error}`);
|
|
111
|
+
});
|
|
107
112
|
});
|
|
108
113
|
}
|
|
109
114
|
addVersions(versions) {
|
|
@@ -111,9 +116,10 @@ class DebuggerUI {
|
|
|
111
116
|
this.versions = versions;
|
|
112
117
|
for (const version of versions) {
|
|
113
118
|
const option = document.createElement("option");
|
|
114
|
-
option.text =
|
|
115
|
-
|
|
116
|
-
|
|
119
|
+
option.text =
|
|
120
|
+
version.date !== undefined
|
|
121
|
+
? `id = ${version.id}, time = ${version.date}`
|
|
122
|
+
: `id = ${version.id}`;
|
|
117
123
|
this.selector.add(option);
|
|
118
124
|
}
|
|
119
125
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidDebuggerUi.js","sourceRoot":"","sources":["../src/fluidDebuggerUi.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage, IVersion } from \"@fluidframework/protocol-definitions\";\n\nexport interface IDebuggerUI {\n /**\n * Version information is provided.\n * Expect updates (information about seq#, timestamp) through updateVersion() calls\n */\n addVersions(version: IVersion[]): void;\n\n /**\n * Call when new version is downloaded from storage\n * Expect multiple callbacks.\n */\n updateVersion(index: number, version: IVersion, seqNumber: number): void;\n\n /**\n * Called in response to successful onVersionSelection() or onSnapshotFileSelection() call\n * and provides extra information about selection.\n * It expected that UI layer would change its mode as result of this call, i.e. switch to\n * displaying op playback controls (if this is supported)\n * Note: There maybe no call to versionSelected() in response to onSnapshotFileSelection() call\n * if file does not exist, has wrong name of wrong format.\n * @param version - version, file name, or undefined if playing ops.\n */\n versionSelected(seqNumber: number, version: IVersion | string): void;\n\n /**\n * Called by controller in response to new ops being downloaded\n * Called with disable = true if there are no (currently) ops to play\n */\n disableNextOpButton(disable: boolean): void;\n\n /**\n * Called by controller when new ops arrive (or we are done playing previous batch)\n * Indicates next batch of ops that would be played when UI calls controller's onOpButtonClick()\n * Called with ops=[] when there are no ops to play.\n */\n updateNextOpText(ops: ISequencedDocumentMessage[]): void;\n\n /**\n * Called periodically when new versions are downloaded from server\n */\n updateVersionText(versionsLeft: number): void;\n\n /**\n * Called periodically to notify about last known op\n * @param lastKnownOp - seq number of last known op. -1 if can't play ops in this mode (load from file)\n * @param stillLoading - true if we did not reach yet the end of the stream\n */\n updateLastOpText(lastKnownOp: number, stillLoading: boolean): void;\n}\n\nexport interface IDebuggerController {\n /**\n * Initialization. UI layers calls into controller to connect the two.\n * @param ui - UI layer\n */\n connectToUi(ui: IDebuggerUI);\n\n /**\n * Called by UI layer when debugger window is closed by user\n * If called before user makes selection of snapshot/file, original\n * document service is returned to loader (instead of debugger service) and normal document load continues.\n */\n onClose(): void;\n\n /**\n * UI Layer notifies about selection of version to continue.\n * On successful load, versionSelected() is called.\n * @param version - Snapshot version to start from.\n */\n onVersionSelection(version: IVersion): void;\n\n /**\n * UI Layer notifies about selection of version to continue.\n * On successful load, versionSelected() is called.\n * @param version - File to load snapshot from\n */\n onSnapshotFileSelection(file: File): void;\n\n /**\n * \"next op\" button is clicked in the UI\n * @param steps - number of ops to play.\n */\n onOpButtonClick(steps: number): void;\n\n /**\n * \"Download ops\" option is clicked in the UI. Returns JSON of the full opStream when available.\n * @param anonymize - anonymize the ops json using the sanitization tool\n */\n onDownloadOpsButtonClick(anonymize: boolean): Promise<string>;\n}\n\nconst debuggerWindowHtml =\n `<Title>Fluid Debugger</Title>\n<body>\n<h3>Fluid Debugger</h3>\nPlease select snapshot or file to start with<br/>\nClose debugger window to proceed to live document<br/><br/>\n<select style='width:250px' id='selector'>\n</select>\n \n<button id='buttonVers' style='width:60px'>Go</button><br/>\n<input id='file' type='file' value='Load from file'/>\n<br/><br/>\n<h4>Download the current document's ops</h4>\n<input type='checkbox' id='anonymize' value='Anonymize'>\n<label for='anonymize'>Anonymize</label>\n<button type='button' id='downloadOps'>Download ops</button>\n<br/><br/><div id='versionText'></div>\n</body>`;\n\nconst debuggerWindowHtml2 =\n `<Title>Fluid Debugger</Title>\n<body>\n<h3>Fluid Debugger</h3>\n<div id='versionText'></div>\n<div id='lastOp'></div>\n<br/>\nStep to move: <input type='number' id='steps' value='1' min='1' style='width:50px'/>\n <button id='buttonOps' style='width:60px'>Go</button>\n<br/><br/>\n<div id='text1'></div><div id='text2'></div><div id='text3'></div>\n<br/>\n<h4>Download the current document's ops</h4>\n<input type='checkbox' id='anonymize' value='Anonymize'>\n<label for='anonymize'>Anonymize</label>\n<button type='button' id='downloadOps'>Download ops</button>\n</body>`;\n\nexport class DebuggerUI {\n public static create(controller: IDebuggerController): DebuggerUI | null {\n if (\n typeof window !== \"object\" ||\n window === null ||\n typeof window.document !== \"object\" ||\n window.document == null) {\n console.log(\"Can't create debugger window - not running in browser!\");\n return null;\n }\n\n const debuggerWindow = window.open(\n \"\",\n \"\",\n \"width=400,height=400,resizable=yes,location=no,menubar=no,titlebar=no,status=no,toolbar=no\");\n if (!debuggerWindow) {\n console.error(\"Can't create debugger window - please enable pop-up windows in your browser!\");\n return null;\n }\n\n return new DebuggerUI(controller, debuggerWindow);\n }\n\n private static formatDate(date: number) {\n // Alternative - without timezone\n // new Date().toLocaleString('default', { timeZone: 'UTC'}));\n // new Date().toLocaleString('default', { year: 'numeric', month: 'short',\n // day: 'numeric', hour: '2-digit', minute: 'numeric', second: 'numeric' }));\n return new Date(date).toUTCString();\n }\n\n protected selector?: HTMLSelectElement;\n protected versionText: HTMLDivElement;\n\n protected buttonOps?: HTMLButtonElement;\n protected text1?: HTMLDivElement;\n protected text2?: HTMLDivElement;\n protected text3?: HTMLDivElement;\n protected lastOpText?: HTMLDivElement;\n protected wasVersionSelected = false;\n protected versions: IVersion[] = [];\n\n protected documentClosed = false;\n\n protected constructor(private readonly controller: IDebuggerController, private readonly debuggerWindow: Window) {\n const doc = this.debuggerWindow.document;\n doc.write(debuggerWindowHtml);\n\n window.addEventListener(\"beforeunload\", (e) => {\n this.documentClosed = true;\n this.debuggerWindow.close();\n }, false);\n\n this.debuggerWindow.addEventListener(\"beforeunload\", (e) => {\n if (!this.documentClosed) {\n this.controller.onClose();\n }\n }, false);\n\n this.selector = doc.getElementById(\"selector\") as HTMLSelectElement;\n\n const buttonVers = doc.getElementById(\"buttonVers\") as HTMLDivElement;\n buttonVers.onclick = () => {\n const index = this.selector!.selectedIndex;\n controller.onVersionSelection(this.versions[index]);\n };\n\n const fileSnapshot = doc.getElementById(\"file\") as HTMLInputElement;\n fileSnapshot.addEventListener(\"change\", () => {\n const files = fileSnapshot.files;\n if (files) {\n controller.onSnapshotFileSelection(files[0]);\n }\n }, false);\n\n const opDownloadButton = doc.getElementById(\"downloadOps\") as HTMLElement;\n const anonymizeCheckbox = doc.getElementById(\"anonymize\") as HTMLInputElement;\n this.attachDownloadOpsListener(opDownloadButton, anonymizeCheckbox);\n\n this.versionText = doc.getElementById(\"versionText\") as HTMLDivElement;\n this.versionText.textContent = \"Fetching snapshots, please wait...\";\n\n controller.connectToUi(this);\n }\n\n private attachDownloadOpsListener(element: HTMLElement, anonymize: HTMLInputElement) {\n element.addEventListener(\"click\", () => {\n this.controller.onDownloadOpsButtonClick(anonymize.checked).then((opJson) => {\n this.download(\"opStream.json\", opJson);\n }).catch((error) => { console.log(`Error downloading ops: ${error}`); });\n });\n }\n\n public addVersions(versions: IVersion[]) {\n if (this.selector) {\n this.versions = versions;\n for (const version of versions) {\n const option = document.createElement(\"option\");\n option.text = version.date !== undefined\n ? `id = ${version.id}, time = ${version.date}`\n : `id = ${version.id}`;\n this.selector.add(option);\n }\n }\n }\n\n public updateVersion(index: number, version: IVersion, seqNumber: number) {\n if (this.selector) {\n const option = this.selector[index] as HTMLOptionElement;\n option.text = `${option.text}, seq = ${seqNumber}`;\n this.selector[index] = option;\n }\n }\n\n public versionSelected(seqNumber: number, version: IVersion | string) {\n const text = typeof version === \"string\"\n ? `Playing ${version} file`\n : `Playing from ${version.id}, seq# ${seqNumber}`;\n\n this.wasVersionSelected = true;\n this.selector = undefined;\n\n const doc = this.debuggerWindow.document;\n doc.open();\n doc.write(debuggerWindowHtml2);\n doc.close();\n\n this.lastOpText = doc.getElementById(\"lastOp\") as HTMLDivElement;\n this.text1 = doc.getElementById(\"text1\") as HTMLDivElement;\n this.text2 = doc.getElementById(\"text2\") as HTMLDivElement;\n this.text3 = doc.getElementById(\"text3\") as HTMLDivElement;\n\n const steps = doc.getElementById(\"steps\") as HTMLInputElement;\n this.buttonOps = doc.getElementById(\"buttonOps\") as HTMLButtonElement;\n this.buttonOps.disabled = true;\n this.buttonOps.onclick = () => {\n this.controller.onOpButtonClick(Number(steps.value));\n };\n\n this.versionText = doc.getElementById(\"versionText\") as HTMLDivElement;\n this.versionText.textContent = text;\n\n const opDownloadButton = doc.getElementById(\"downloadOps\") as HTMLElement;\n const anonymizeCheckbox = doc.getElementById(\"anonymize\") as HTMLInputElement;\n this.attachDownloadOpsListener(opDownloadButton, anonymizeCheckbox);\n }\n\n public disableNextOpButton(disable: boolean) {\n assert(!!this.buttonOps, 0x088 /* \"Missing button ops button!\" */);\n this.buttonOps.disabled = disable;\n }\n\n public updateNextOpText(ops: ISequencedDocumentMessage[]) {\n if (ops.length === 0) {\n this.text1!.textContent = \"\";\n this.text2!.textContent = \"\";\n this.text3!.textContent = \"\";\n } else {\n const op = ops[0];\n const seq = op.sequenceNumber;\n const date = DebuggerUI.formatDate(op.timestamp);\n this.text1!.textContent = `Next op seq#: ${seq}`;\n this.text2!.textContent = `Type: ${op.type}`;\n this.text3!.textContent = `${date}`;\n }\n }\n\n public updateVersionText(versionCount: number) {\n if (!this.wasVersionSelected) {\n const text = versionCount === 0 ? \"\" : `Fetching information about ${versionCount} snapshots...`;\n this.versionText.textContent = text;\n }\n }\n\n public updateLastOpText(lastKnownOp: number, stillLoading: boolean) {\n const text = stillLoading\n ? `Last op (still loading): ${lastKnownOp}`\n : `Document's last op seq#: ${lastKnownOp}`;\n this.lastOpText!.textContent = text;\n }\n\n private download(filename: string, data: string): void {\n const element = document.createElement(\"a\");\n element.setAttribute(\"href\", `data:text/plain;charset=utf-8,${ encodeURIComponent(data) }`);\n element.setAttribute(\"download\", filename);\n\n element.style.display = \"none\";\n document.body.appendChild(element);\n\n element.click();\n\n document.body.removeChild(element);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fluidDebuggerUi.js","sourceRoot":"","sources":["../src/fluidDebuggerUi.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage, IVersion } from \"@fluidframework/protocol-definitions\";\n\nexport interface IDebuggerUI {\n\t/**\n\t * Version information is provided.\n\t * Expect updates (information about seq#, timestamp) through updateVersion() calls\n\t */\n\taddVersions(version: IVersion[]): void;\n\n\t/**\n\t * Call when new version is downloaded from storage\n\t * Expect multiple callbacks.\n\t */\n\tupdateVersion(index: number, version: IVersion, seqNumber: number): void;\n\n\t/**\n\t * Called in response to successful onVersionSelection() or onSnapshotFileSelection() call\n\t * and provides extra information about selection.\n\t * It expected that UI layer would change its mode as result of this call, i.e. switch to\n\t * displaying op playback controls (if this is supported)\n\t * Note: There maybe no call to versionSelected() in response to onSnapshotFileSelection() call\n\t * if file does not exist, has wrong name of wrong format.\n\t * @param version - version, file name, or undefined if playing ops.\n\t */\n\tversionSelected(seqNumber: number, version: IVersion | string): void;\n\n\t/**\n\t * Called by controller in response to new ops being downloaded\n\t * Called with disable = true if there are no (currently) ops to play\n\t */\n\tdisableNextOpButton(disable: boolean): void;\n\n\t/**\n\t * Called by controller when new ops arrive (or we are done playing previous batch)\n\t * Indicates next batch of ops that would be played when UI calls controller's onOpButtonClick()\n\t * Called with ops=[] when there are no ops to play.\n\t */\n\tupdateNextOpText(ops: ISequencedDocumentMessage[]): void;\n\n\t/**\n\t * Called periodically when new versions are downloaded from server\n\t */\n\tupdateVersionText(versionsLeft: number): void;\n\n\t/**\n\t * Called periodically to notify about last known op\n\t * @param lastKnownOp - seq number of last known op. -1 if can't play ops in this mode (load from file)\n\t * @param stillLoading - true if we did not reach yet the end of the stream\n\t */\n\tupdateLastOpText(lastKnownOp: number, stillLoading: boolean): void;\n}\n\nexport interface IDebuggerController {\n\t/**\n\t * Initialization. UI layers calls into controller to connect the two.\n\t * @param ui - UI layer\n\t */\n\tconnectToUi(ui: IDebuggerUI);\n\n\t/**\n\t * Called by UI layer when debugger window is closed by user\n\t * If called before user makes selection of snapshot/file, original\n\t * document service is returned to loader (instead of debugger service) and normal document load continues.\n\t */\n\tonClose(): void;\n\n\t/**\n\t * UI Layer notifies about selection of version to continue.\n\t * On successful load, versionSelected() is called.\n\t * @param version - Snapshot version to start from.\n\t */\n\tonVersionSelection(version: IVersion): void;\n\n\t/**\n\t * UI Layer notifies about selection of version to continue.\n\t * On successful load, versionSelected() is called.\n\t * @param version - File to load snapshot from\n\t */\n\tonSnapshotFileSelection(file: File): void;\n\n\t/**\n\t * \"next op\" button is clicked in the UI\n\t * @param steps - number of ops to play.\n\t */\n\tonOpButtonClick(steps: number): void;\n\n\t/**\n\t * \"Download ops\" option is clicked in the UI. Returns JSON of the full opStream when available.\n\t * @param anonymize - anonymize the ops json using the sanitization tool\n\t */\n\tonDownloadOpsButtonClick(anonymize: boolean): Promise<string>;\n}\n\nconst debuggerWindowHtml = `<Title>Fluid Debugger</Title>\n<body>\n<h3>Fluid Debugger</h3>\nPlease select snapshot or file to start with<br/>\nClose debugger window to proceed to live document<br/><br/>\n<select style='width:250px' id='selector'>\n</select>\n \n<button id='buttonVers' style='width:60px'>Go</button><br/>\n<input id='file' type='file' value='Load from file'/>\n<br/><br/>\n<h4>Download the current document's ops</h4>\n<input type='checkbox' id='anonymize' value='Anonymize'>\n<label for='anonymize'>Anonymize</label>\n<button type='button' id='downloadOps'>Download ops</button>\n<br/><br/><div id='versionText'></div>\n</body>`;\n\nconst debuggerWindowHtml2 = `<Title>Fluid Debugger</Title>\n<body>\n<h3>Fluid Debugger</h3>\n<div id='versionText'></div>\n<div id='lastOp'></div>\n<br/>\nStep to move: <input type='number' id='steps' value='1' min='1' style='width:50px'/>\n <button id='buttonOps' style='width:60px'>Go</button>\n<br/><br/>\n<div id='text1'></div><div id='text2'></div><div id='text3'></div>\n<br/>\n<h4>Download the current document's ops</h4>\n<input type='checkbox' id='anonymize' value='Anonymize'>\n<label for='anonymize'>Anonymize</label>\n<button type='button' id='downloadOps'>Download ops</button>\n</body>`;\n\nexport class DebuggerUI {\n\tpublic static create(controller: IDebuggerController): DebuggerUI | null {\n\t\tif (\n\t\t\ttypeof window !== \"object\" ||\n\t\t\twindow === null ||\n\t\t\ttypeof window.document !== \"object\" ||\n\t\t\twindow.document == null\n\t\t) {\n\t\t\tconsole.log(\"Can't create debugger window - not running in browser!\");\n\t\t\treturn null;\n\t\t}\n\n\t\tconst debuggerWindow = window.open(\n\t\t\t\"\",\n\t\t\t\"\",\n\t\t\t\"width=400,height=400,resizable=yes,location=no,menubar=no,titlebar=no,status=no,toolbar=no\",\n\t\t);\n\t\tif (!debuggerWindow) {\n\t\t\tconsole.error(\n\t\t\t\t\"Can't create debugger window - please enable pop-up windows in your browser!\",\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn new DebuggerUI(controller, debuggerWindow);\n\t}\n\n\tprivate static formatDate(date: number) {\n\t\t// Alternative - without timezone\n\t\t// new Date().toLocaleString('default', { timeZone: 'UTC'}));\n\t\t// new Date().toLocaleString('default', { year: 'numeric', month: 'short',\n\t\t// day: 'numeric', hour: '2-digit', minute: 'numeric', second: 'numeric' }));\n\t\treturn new Date(date).toUTCString();\n\t}\n\n\tprotected selector?: HTMLSelectElement;\n\tprotected versionText: HTMLDivElement;\n\n\tprotected buttonOps?: HTMLButtonElement;\n\tprotected text1?: HTMLDivElement;\n\tprotected text2?: HTMLDivElement;\n\tprotected text3?: HTMLDivElement;\n\tprotected lastOpText?: HTMLDivElement;\n\tprotected wasVersionSelected = false;\n\tprotected versions: IVersion[] = [];\n\n\tprotected documentClosed = false;\n\n\tprotected constructor(\n\t\tprivate readonly controller: IDebuggerController,\n\t\tprivate readonly debuggerWindow: Window,\n\t) {\n\t\tconst doc = this.debuggerWindow.document;\n\t\tdoc.write(debuggerWindowHtml);\n\n\t\twindow.addEventListener(\n\t\t\t\"beforeunload\",\n\t\t\t(e) => {\n\t\t\t\tthis.documentClosed = true;\n\t\t\t\tthis.debuggerWindow.close();\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\n\t\tthis.debuggerWindow.addEventListener(\n\t\t\t\"beforeunload\",\n\t\t\t(e) => {\n\t\t\t\tif (!this.documentClosed) {\n\t\t\t\t\tthis.controller.onClose();\n\t\t\t\t}\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\n\t\tthis.selector = doc.getElementById(\"selector\") as HTMLSelectElement;\n\n\t\tconst buttonVers = doc.getElementById(\"buttonVers\") as HTMLDivElement;\n\t\tbuttonVers.onclick = () => {\n\t\t\tconst index = this.selector!.selectedIndex;\n\t\t\tcontroller.onVersionSelection(this.versions[index]);\n\t\t};\n\n\t\tconst fileSnapshot = doc.getElementById(\"file\") as HTMLInputElement;\n\t\tfileSnapshot.addEventListener(\n\t\t\t\"change\",\n\t\t\t() => {\n\t\t\t\tconst files = fileSnapshot.files;\n\t\t\t\tif (files) {\n\t\t\t\t\tcontroller.onSnapshotFileSelection(files[0]);\n\t\t\t\t}\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\n\t\tconst opDownloadButton = doc.getElementById(\"downloadOps\") as HTMLElement;\n\t\tconst anonymizeCheckbox = doc.getElementById(\"anonymize\") as HTMLInputElement;\n\t\tthis.attachDownloadOpsListener(opDownloadButton, anonymizeCheckbox);\n\n\t\tthis.versionText = doc.getElementById(\"versionText\") as HTMLDivElement;\n\t\tthis.versionText.textContent = \"Fetching snapshots, please wait...\";\n\n\t\tcontroller.connectToUi(this);\n\t}\n\n\tprivate attachDownloadOpsListener(element: HTMLElement, anonymize: HTMLInputElement) {\n\t\telement.addEventListener(\"click\", () => {\n\t\t\tthis.controller\n\t\t\t\t.onDownloadOpsButtonClick(anonymize.checked)\n\t\t\t\t.then((opJson) => {\n\t\t\t\t\tthis.download(\"opStream.json\", opJson);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.log(`Error downloading ops: ${error}`);\n\t\t\t\t});\n\t\t});\n\t}\n\n\tpublic addVersions(versions: IVersion[]) {\n\t\tif (this.selector) {\n\t\t\tthis.versions = versions;\n\t\t\tfor (const version of versions) {\n\t\t\t\tconst option = document.createElement(\"option\");\n\t\t\t\toption.text =\n\t\t\t\t\tversion.date !== undefined\n\t\t\t\t\t\t? `id = ${version.id}, time = ${version.date}`\n\t\t\t\t\t\t: `id = ${version.id}`;\n\t\t\t\tthis.selector.add(option);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic updateVersion(index: number, version: IVersion, seqNumber: number) {\n\t\tif (this.selector) {\n\t\t\tconst option = this.selector[index] as HTMLOptionElement;\n\t\t\toption.text = `${option.text}, seq = ${seqNumber}`;\n\t\t\tthis.selector[index] = option;\n\t\t}\n\t}\n\n\tpublic versionSelected(seqNumber: number, version: IVersion | string) {\n\t\tconst text =\n\t\t\ttypeof version === \"string\"\n\t\t\t\t? `Playing ${version} file`\n\t\t\t\t: `Playing from ${version.id}, seq# ${seqNumber}`;\n\n\t\tthis.wasVersionSelected = true;\n\t\tthis.selector = undefined;\n\n\t\tconst doc = this.debuggerWindow.document;\n\t\tdoc.open();\n\t\tdoc.write(debuggerWindowHtml2);\n\t\tdoc.close();\n\n\t\tthis.lastOpText = doc.getElementById(\"lastOp\") as HTMLDivElement;\n\t\tthis.text1 = doc.getElementById(\"text1\") as HTMLDivElement;\n\t\tthis.text2 = doc.getElementById(\"text2\") as HTMLDivElement;\n\t\tthis.text3 = doc.getElementById(\"text3\") as HTMLDivElement;\n\n\t\tconst steps = doc.getElementById(\"steps\") as HTMLInputElement;\n\t\tthis.buttonOps = doc.getElementById(\"buttonOps\") as HTMLButtonElement;\n\t\tthis.buttonOps.disabled = true;\n\t\tthis.buttonOps.onclick = () => {\n\t\t\tthis.controller.onOpButtonClick(Number(steps.value));\n\t\t};\n\n\t\tthis.versionText = doc.getElementById(\"versionText\") as HTMLDivElement;\n\t\tthis.versionText.textContent = text;\n\n\t\tconst opDownloadButton = doc.getElementById(\"downloadOps\") as HTMLElement;\n\t\tconst anonymizeCheckbox = doc.getElementById(\"anonymize\") as HTMLInputElement;\n\t\tthis.attachDownloadOpsListener(opDownloadButton, anonymizeCheckbox);\n\t}\n\n\tpublic disableNextOpButton(disable: boolean) {\n\t\tassert(!!this.buttonOps, 0x088 /* \"Missing button ops button!\" */);\n\t\tthis.buttonOps.disabled = disable;\n\t}\n\n\tpublic updateNextOpText(ops: ISequencedDocumentMessage[]) {\n\t\tif (ops.length === 0) {\n\t\t\tthis.text1!.textContent = \"\";\n\t\t\tthis.text2!.textContent = \"\";\n\t\t\tthis.text3!.textContent = \"\";\n\t\t} else {\n\t\t\tconst op = ops[0];\n\t\t\tconst seq = op.sequenceNumber;\n\t\t\tconst date = DebuggerUI.formatDate(op.timestamp);\n\t\t\tthis.text1!.textContent = `Next op seq#: ${seq}`;\n\t\t\tthis.text2!.textContent = `Type: ${op.type}`;\n\t\t\tthis.text3!.textContent = `${date}`;\n\t\t}\n\t}\n\n\tpublic updateVersionText(versionCount: number) {\n\t\tif (!this.wasVersionSelected) {\n\t\t\tconst text =\n\t\t\t\tversionCount === 0 ? \"\" : `Fetching information about ${versionCount} snapshots...`;\n\t\t\tthis.versionText.textContent = text;\n\t\t}\n\t}\n\n\tpublic updateLastOpText(lastKnownOp: number, stillLoading: boolean) {\n\t\tconst text = stillLoading\n\t\t\t? `Last op (still loading): ${lastKnownOp}`\n\t\t\t: `Document's last op seq#: ${lastKnownOp}`;\n\t\tthis.lastOpText!.textContent = text;\n\t}\n\n\tprivate download(filename: string, data: string): void {\n\t\tconst element = document.createElement(\"a\");\n\t\telement.setAttribute(\"href\", `data:text/plain;charset=utf-8,${encodeURIComponent(data)}`);\n\t\telement.setAttribute(\"download\", filename);\n\n\t\telement.style.display = \"none\";\n\t\tdocument.body.appendChild(element);\n\n\t\telement.click();\n\n\t\tdocument.body.removeChild(element);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageSchema.js","sourceRoot":"","sources":["../src/messageSchema.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 { Schema } from \"jsonschema\";\n\nexport const joinContentsSchema = {\n type: \"null\",\n};\n\nexport const joinDataSchema = {\n type: \"object\",\n properties: {\n clientId: { type: \"string\" },\n detail: {\n type: \"object\",\n properties: {\n details: { type: \"object\" },\n mode: { type: \"string\" },\n permission: { type: \"array\" },\n scopes: { type: \"array\" },\n type: { type: \"string\" },\n user: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n name: { type: \"string\" },\n email: { type: \"string\" },\n },\n required: [\"id\", \"name\", \"email\"],\n additionalProperties: false,\n },\n },\n required: [\"user\"],\n additionalProperties: false,\n },\n },\n required: [\"clientId\", \"detail\"],\n additionalProperties: false,\n};\n\nexport const proposeContentsSchema = {\n type: [\"string\", \"object\"],\n properties: {\n key: { type: \"string\" },\n value: { type: \"string\" },\n },\n required: [\"key\"],\n additionalProperties: false,\n};\n\n// The parsed json of a propose message's contents value\nexport const proposeCodeSchema = {\n type: \"object\",\n properties: {\n key: { type: \"string\" },\n value: {\n type: \"object\",\n properties: {\n package: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n version: { type: \"string\" },\n fluid: { type: \"object\" },\n },\n required: [\"name\"],\n },\n config: { type: \"object\" },\n },\n required: [\"package\", \"config\"],\n additionalProperties: false,\n },\n },\n required: [\"key\", \"value\"],\n additionalProperties: false,\n};\n\n// This also needs to be in the root \"definitions\" key as \"entries\" to be used\nconst attachSnapshotEntriesSchema = {\n type: \"object\",\n properties: {\n mode: { type: \"string\" },\n path: { type: \"string\" },\n type: { enum: [\"Blob\", \"Tree\"] },\n value: {\n type: \"object\",\n oneOf: [\n // type Blob\n {\n properties: {\n contents: { type: \"string\" },\n encoding: { type: \"string\" },\n // Verify this\n id: { type: \"null\" },\n },\n required: [\"contents\", \"encoding\"],\n additionalProperties: false,\n },\n // type Tree\n {\n properties: {\n entries: {\n type: \"array\",\n items: { $ref: \"#/definitions/entries\" },\n },\n // Verify this\n id: { type: \"null\" },\n },\n required: [\"entries\"],\n additionalProperties: false,\n },\n ],\n },\n },\n required: [\"mode\", \"path\", \"type\", \"value\"],\n additionalProperties: false,\n};\n\nexport const attachContentsSchema = {\n definitions: {\n entries: attachSnapshotEntriesSchema,\n },\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n snapshot: {\n type: \"object\",\n properties: {\n entries: {\n type: \"array\",\n items: { $ref: \"#/definitions/entries\" },\n },\n // Verify this\n id: { type: \"null\" },\n },\n required: [\"entries\"],\n additionalProperties: false,\n },\n type: { type: \"string\" },\n },\n required: [\"id\", \"snapshot\", \"type\"],\n additionalProperties: false,\n};\n\n// can exist at the root level or within an op\nexport const chunkedOpContentsSchema = {\n type: \"object\",\n properties: {\n chunkId: { type: \"number\" },\n contents: { type: \"string\" },\n originalType: { type: \"string\" },\n totalChunks: { type: \"number\" },\n },\n required: [\"chunkId\", \"contents\", \"originalType\", \"totalChunks\"],\n additionalProperties: false,\n};\n\nconst contentsSchema = {\n type: \"object\",\n properties: {\n address: { type: \"string\" },\n contents: {\n type: \"object\",\n properties: {\n content: { type: \"object\" },\n type: { type: \"string\" },\n },\n required: [\"content\", \"type\"],\n additionalProperties: false,\n },\n },\n required: [\"address\", \"contents\"],\n additionalProperties: false,\n};\n\n// special contents formats from containerRuntime.ts's ContainerMessageType\nexport const opContentsSchema = {\n definitions: {\n content: contentsSchema,\n entries: attachSnapshotEntriesSchema,\n attachContents: attachContentsSchema,\n chunkedOpContents: chunkedOpContentsSchema,\n },\n type: \"object\",\n oneOf: [\n {\n properties: {\n type: { enum: [\"component\"] },\n contents: { $ref: \"#/definitions/content\" },\n },\n required: [\"type\", \"contents\"],\n additionalProperties: false,\n },\n {\n properties: {\n type: { enum: [\"attach\"] },\n contents: { $ref: \"#/definitions/attachContents\" },\n },\n required: [\"type\", \"contents\"],\n additionalProperties: false,\n },\n {\n properties: {\n type: { enum: [\"chunkedOp\"] },\n contents: { $ref: \"#/definitions/chunkedOpContents\" },\n },\n required: [\"type\", \"contents\"],\n additionalProperties: false,\n },\n {\n $ref: \"#/definitions/content\",\n },\n ],\n};\n\n// \"op\" message's contents.contents.content schemas\n\nexport const opContentsAttachSchema = attachContentsSchema;\n\n// Ops from dds/register-collection's consensusRegisterCollection\nexport const opContentsRegisterCollectionSchema = {\n type: \"object\",\n properties: {\n address: { type: \"string\" },\n contents: {\n type: \"object\",\n properties: {\n key: { type: \"string\" },\n refSeq: { type: \"number\" },\n serializedValue: { type: \"string\" },\n value: {\n type: \"object\",\n properties: {\n type: { type: \"string\" },\n value: { },\n },\n required: [\"type\", \"value\"],\n additionalProperties: false,\n },\n type: {\n type: \"string\",\n enum: [\"write\"],\n },\n },\n required: [\"key\", \"type\"],\n additionalProperties: false,\n },\n },\n required: [\"address\", \"contents\"],\n additionalProperties: false,\n};\n\n// Ops from dds/map's directory.ts\nexport const opContentsMapSchema = {\n type: \"object\",\n properties: {\n address: { type: \"string\" },\n contents: {\n type: \"object\",\n properties: {\n key: { type: \"string\" },\n path: { type: \"string\" },\n subdirName: { type: \"string\" },\n value: {\n type: \"object\",\n properties: {\n type: { type: \"string\" },\n value: { },\n },\n required: [\"type\"],\n additionalProperties: false,\n },\n type: {\n type: \"string\",\n enum: [\n \"act\",\n \"set\",\n \"delete\",\n \"clear\",\n \"createSubDirectory\",\n \"deleteSubDirectory\",\n ],\n },\n },\n required: [\"type\"],\n additionalProperties: false,\n // specific property combinations based on type value\n oneOf: [\n {\n properties: { type: { enum: [\"act\"] } },\n required: [\"key\", \"path\", \"value\"],\n },\n {\n properties: { type: { enum: [\"set\"] } },\n required: [\"key\", \"value\"],\n },\n {\n properties: { type: { enum: [\"delete\"] } },\n required: [\"key\"],\n },\n {\n properties: { type: { enum: [\"clear\"] } },\n required: [\"path\"],\n },\n {\n properties: { type: { enum: [\"createSubDirectory\", \"deleteSubDirectory\"] } },\n required: [\"path\", \"subdirName\"],\n },\n ],\n },\n },\n required: [\"address\", \"contents\"],\n additionalProperties: false,\n};\n\n// from dds/merge-tree's ops.ts and opBuilder.ts\n// Note: written op objects in opBuilder.ts are more restrictive than their\n// corresponding interface definitions in ops.ts, and the more restrictive\n// schema are used here\nconst mergeTreeRelativePosSchema = {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n before: { type: \"boolean\" },\n offset: { type: \"number\" },\n },\n additionalProperties: false,\n};\n\nconst mergeTreeDeltaOpSchema = {\n type: \"object\",\n properties: {\n type: {\n type: \"number\",\n minimum: 0 /* MergeTreeDeltaType.INSERT */,\n maximum: 2 /* MergeTreeDeltaType.ANNOTATE */,\n },\n },\n required: [\"type\"],\n oneOf: [\n {\n properties: {\n type: { enum: [0] },\n seg: { type: [\"string\", \"object\"] },\n pos1: { type: \"number\" },\n },\n required: [\"pos1\"],\n additionalProperties: false,\n },\n {\n properties: {\n type: { enum: [1] },\n register: { type: \"string\" },\n pos1: { type: \"number\" },\n pos2: { type: \"number\" },\n },\n required: [\"pos1\"],\n additionalProperties: false,\n },\n {\n properties: {\n type: { enum: [2] },\n combiningOp: {\n type: \"object\",\n properties: {\n defaultValue: { },\n maxValue: { },\n minValue: { },\n name: { type: \"string\" },\n },\n required: [\"name\"],\n additionalProperties: false,\n },\n pos1: { type: \"number\" },\n pos2: { type: \"number\" },\n props: { type: \"object\" },\n register: { type: \"string\" },\n relativePos1: { $ref: \"#/definitions/relativePos\" },\n relativePos2: { $ref: \"#/definitions/relativePos\" },\n },\n required: [\"props\"],\n additionalProperties: false,\n },\n // There's something weird with the typings/settings here where this doesn't get\n // recognized as a valid Schema array if more than 1 item has \"properties\" defined\n ] as Schema[],\n};\n\nconst mergeTreeGroupOpSchema = {\n type: \"object\",\n properties: {\n ops: {\n type: \"array\",\n items: { $ref: \"#/definitions/deltaOp\" },\n },\n type: {\n type: \"number\",\n minimum: 3 /* MergeTreeDeltaType.GROUP */,\n maximum: 3 /* MergeTreeDeltaType.GROUP */,\n },\n },\n required: [\"ops\", \"type\"],\n additionalProperties: false,\n};\n\nexport const opContentsMergeTreeDeltaOpSchema = {\n definitions: {\n relativePos: mergeTreeRelativePosSchema,\n deltaOp: mergeTreeDeltaOpSchema,\n },\n type: \"object\",\n properties: {\n address: { type: \"string\" },\n contents: { $ref: \"#/definitions/deltaOp\" },\n },\n required: [\"address\", \"contents\"],\n additionalProperties: false,\n};\n\nexport const opContentsMergeTreeGroupOpSchema = {\n definitions: {\n relativePos: mergeTreeRelativePosSchema,\n deltaOp: mergeTreeDeltaOpSchema,\n groupOp: mergeTreeGroupOpSchema,\n },\n type: \"object\",\n properties: {\n address: { type: \"string\" },\n contents: { $ref: \"#/definitions/groupOp\" },\n },\n required: [\"address\", \"contents\"],\n additionalProperties: false,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"messageSchema.js","sourceRoot":"","sources":["../src/messageSchema.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 { Schema } from \"jsonschema\";\n\nexport const joinContentsSchema = {\n\ttype: \"null\",\n};\n\nexport const joinDataSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tclientId: { type: \"string\" },\n\t\tdetail: {\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tdetails: { type: \"object\" },\n\t\t\t\tmode: { type: \"string\" },\n\t\t\t\tpermission: { type: \"array\" },\n\t\t\t\tscopes: { type: \"array\" },\n\t\t\t\ttype: { type: \"string\" },\n\t\t\t\tuser: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tid: { type: \"string\" },\n\t\t\t\t\t\tname: { type: \"string\" },\n\t\t\t\t\t\temail: { type: \"string\" },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"id\", \"name\", \"email\"],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\trequired: [\"user\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t},\n\trequired: [\"clientId\", \"detail\"],\n\tadditionalProperties: false,\n};\n\nexport const proposeContentsSchema = {\n\ttype: [\"string\", \"object\"],\n\tproperties: {\n\t\tkey: { type: \"string\" },\n\t\tvalue: { type: \"string\" },\n\t},\n\trequired: [\"key\"],\n\tadditionalProperties: false,\n};\n\n// The parsed json of a propose message's contents value\nexport const proposeCodeSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tkey: { type: \"string\" },\n\t\tvalue: {\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tpackage: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tname: { type: \"string\" },\n\t\t\t\t\t\tversion: { type: \"string\" },\n\t\t\t\t\t\tfluid: { type: \"object\" },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"name\"],\n\t\t\t\t},\n\t\t\t\tconfig: { type: \"object\" },\n\t\t\t},\n\t\t\trequired: [\"package\", \"config\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t},\n\trequired: [\"key\", \"value\"],\n\tadditionalProperties: false,\n};\n\n// This also needs to be in the root \"definitions\" key as \"entries\" to be used\nconst attachSnapshotEntriesSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tmode: { type: \"string\" },\n\t\tpath: { type: \"string\" },\n\t\ttype: { enum: [\"Blob\", \"Tree\"] },\n\t\tvalue: {\n\t\t\ttype: \"object\",\n\t\t\toneOf: [\n\t\t\t\t// type Blob\n\t\t\t\t{\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tcontents: { type: \"string\" },\n\t\t\t\t\t\tencoding: { type: \"string\" },\n\t\t\t\t\t\t// Verify this\n\t\t\t\t\t\tid: { type: \"null\" },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"contents\", \"encoding\"],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t\t// type Tree\n\t\t\t\t{\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tentries: {\n\t\t\t\t\t\t\ttype: \"array\",\n\t\t\t\t\t\t\titems: { $ref: \"#/definitions/entries\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Verify this\n\t\t\t\t\t\tid: { type: \"null\" },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"entries\"],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n\trequired: [\"mode\", \"path\", \"type\", \"value\"],\n\tadditionalProperties: false,\n};\n\nexport const attachContentsSchema = {\n\tdefinitions: {\n\t\tentries: attachSnapshotEntriesSchema,\n\t},\n\ttype: \"object\",\n\tproperties: {\n\t\tid: { type: \"string\" },\n\t\tsnapshot: {\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tentries: {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\titems: { $ref: \"#/definitions/entries\" },\n\t\t\t\t},\n\t\t\t\t// Verify this\n\t\t\t\tid: { type: \"null\" },\n\t\t\t},\n\t\t\trequired: [\"entries\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\ttype: { type: \"string\" },\n\t},\n\trequired: [\"id\", \"snapshot\", \"type\"],\n\tadditionalProperties: false,\n};\n\n// can exist at the root level or within an op\nexport const chunkedOpContentsSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tchunkId: { type: \"number\" },\n\t\tcontents: { type: \"string\" },\n\t\toriginalType: { type: \"string\" },\n\t\ttotalChunks: { type: \"number\" },\n\t},\n\trequired: [\"chunkId\", \"contents\", \"originalType\", \"totalChunks\"],\n\tadditionalProperties: false,\n};\n\nconst contentsSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\taddress: { type: \"string\" },\n\t\tcontents: {\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tcontent: { type: \"object\" },\n\t\t\t\ttype: { type: \"string\" },\n\t\t\t},\n\t\t\trequired: [\"content\", \"type\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t},\n\trequired: [\"address\", \"contents\"],\n\tadditionalProperties: false,\n};\n\n// special contents formats from containerRuntime.ts's ContainerMessageType\nexport const opContentsSchema = {\n\tdefinitions: {\n\t\tcontent: contentsSchema,\n\t\tentries: attachSnapshotEntriesSchema,\n\t\tattachContents: attachContentsSchema,\n\t\tchunkedOpContents: chunkedOpContentsSchema,\n\t},\n\ttype: \"object\",\n\toneOf: [\n\t\t{\n\t\t\tproperties: {\n\t\t\t\ttype: { enum: [\"component\"] },\n\t\t\t\tcontents: { $ref: \"#/definitions/content\" },\n\t\t\t},\n\t\t\trequired: [\"type\", \"contents\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\t{\n\t\t\tproperties: {\n\t\t\t\ttype: { enum: [\"attach\"] },\n\t\t\t\tcontents: { $ref: \"#/definitions/attachContents\" },\n\t\t\t},\n\t\t\trequired: [\"type\", \"contents\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\t{\n\t\t\tproperties: {\n\t\t\t\ttype: { enum: [\"chunkedOp\"] },\n\t\t\t\tcontents: { $ref: \"#/definitions/chunkedOpContents\" },\n\t\t\t},\n\t\t\trequired: [\"type\", \"contents\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\t{\n\t\t\t$ref: \"#/definitions/content\",\n\t\t},\n\t],\n};\n\n// \"op\" message's contents.contents.content schemas\n\nexport const opContentsAttachSchema = attachContentsSchema;\n\n// Ops from dds/register-collection's consensusRegisterCollection\nexport const opContentsRegisterCollectionSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\taddress: { type: \"string\" },\n\t\tcontents: {\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tkey: { type: \"string\" },\n\t\t\t\trefSeq: { type: \"number\" },\n\t\t\t\tserializedValue: { type: \"string\" },\n\t\t\t\tvalue: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\ttype: { type: \"string\" },\n\t\t\t\t\t\tvalue: {},\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"type\", \"value\"],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t\ttype: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tenum: [\"write\"],\n\t\t\t\t},\n\t\t\t},\n\t\t\trequired: [\"key\", \"type\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t},\n\trequired: [\"address\", \"contents\"],\n\tadditionalProperties: false,\n};\n\n// Ops from dds/map's directory.ts\nexport const opContentsMapSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\taddress: { type: \"string\" },\n\t\tcontents: {\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tkey: { type: \"string\" },\n\t\t\t\tpath: { type: \"string\" },\n\t\t\t\tsubdirName: { type: \"string\" },\n\t\t\t\tvalue: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\ttype: { type: \"string\" },\n\t\t\t\t\t\tvalue: {},\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"type\"],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t\ttype: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tenum: [\n\t\t\t\t\t\t\"act\",\n\t\t\t\t\t\t\"set\",\n\t\t\t\t\t\t\"delete\",\n\t\t\t\t\t\t\"clear\",\n\t\t\t\t\t\t\"createSubDirectory\",\n\t\t\t\t\t\t\"deleteSubDirectory\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\trequired: [\"type\"],\n\t\t\tadditionalProperties: false,\n\t\t\t// specific property combinations based on type value\n\t\t\toneOf: [\n\t\t\t\t{\n\t\t\t\t\tproperties: { type: { enum: [\"act\"] } },\n\t\t\t\t\trequired: [\"key\", \"path\", \"value\"],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tproperties: { type: { enum: [\"set\"] } },\n\t\t\t\t\trequired: [\"key\", \"value\"],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tproperties: { type: { enum: [\"delete\"] } },\n\t\t\t\t\trequired: [\"key\"],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tproperties: { type: { enum: [\"clear\"] } },\n\t\t\t\t\trequired: [\"path\"],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tproperties: { type: { enum: [\"createSubDirectory\", \"deleteSubDirectory\"] } },\n\t\t\t\t\trequired: [\"path\", \"subdirName\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n\trequired: [\"address\", \"contents\"],\n\tadditionalProperties: false,\n};\n\n// from dds/merge-tree's ops.ts and opBuilder.ts\n// Note: written op objects in opBuilder.ts are more restrictive than their\n// corresponding interface definitions in ops.ts, and the more restrictive\n// schema are used here\nconst mergeTreeRelativePosSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tid: { type: \"string\" },\n\t\tbefore: { type: \"boolean\" },\n\t\toffset: { type: \"number\" },\n\t},\n\tadditionalProperties: false,\n};\n\nconst mergeTreeDeltaOpSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\ttype: {\n\t\t\ttype: \"number\",\n\t\t\tminimum: 0 /* MergeTreeDeltaType.INSERT */,\n\t\t\tmaximum: 2 /* MergeTreeDeltaType.ANNOTATE */,\n\t\t},\n\t},\n\trequired: [\"type\"],\n\toneOf: [\n\t\t{\n\t\t\tproperties: {\n\t\t\t\ttype: { enum: [0] },\n\t\t\t\tseg: { type: [\"string\", \"object\"] },\n\t\t\t\tpos1: { type: \"number\" },\n\t\t\t},\n\t\t\trequired: [\"pos1\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\t{\n\t\t\tproperties: {\n\t\t\t\ttype: { enum: [1] },\n\t\t\t\tregister: { type: \"string\" },\n\t\t\t\tpos1: { type: \"number\" },\n\t\t\t\tpos2: { type: \"number\" },\n\t\t\t},\n\t\t\trequired: [\"pos1\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\t{\n\t\t\tproperties: {\n\t\t\t\ttype: { enum: [2] },\n\t\t\t\tcombiningOp: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tdefaultValue: {},\n\t\t\t\t\t\tmaxValue: {},\n\t\t\t\t\t\tminValue: {},\n\t\t\t\t\t\tname: { type: \"string\" },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"name\"],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t\tpos1: { type: \"number\" },\n\t\t\t\tpos2: { type: \"number\" },\n\t\t\t\tprops: { type: \"object\" },\n\t\t\t\tregister: { type: \"string\" },\n\t\t\t\trelativePos1: { $ref: \"#/definitions/relativePos\" },\n\t\t\t\trelativePos2: { $ref: \"#/definitions/relativePos\" },\n\t\t\t},\n\t\t\trequired: [\"props\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\t// There's something weird with the typings/settings here where this doesn't get\n\t\t// recognized as a valid Schema array if more than 1 item has \"properties\" defined\n\t] as Schema[],\n};\n\nconst mergeTreeGroupOpSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tops: {\n\t\t\ttype: \"array\",\n\t\t\titems: { $ref: \"#/definitions/deltaOp\" },\n\t\t},\n\t\ttype: {\n\t\t\ttype: \"number\",\n\t\t\tminimum: 3 /* MergeTreeDeltaType.GROUP */,\n\t\t\tmaximum: 3 /* MergeTreeDeltaType.GROUP */,\n\t\t},\n\t},\n\trequired: [\"ops\", \"type\"],\n\tadditionalProperties: false,\n};\n\nexport const opContentsMergeTreeDeltaOpSchema = {\n\tdefinitions: {\n\t\trelativePos: mergeTreeRelativePosSchema,\n\t\tdeltaOp: mergeTreeDeltaOpSchema,\n\t},\n\ttype: \"object\",\n\tproperties: {\n\t\taddress: { type: \"string\" },\n\t\tcontents: { $ref: \"#/definitions/deltaOp\" },\n\t},\n\trequired: [\"address\", \"contents\"],\n\tadditionalProperties: false,\n};\n\nexport const opContentsMergeTreeGroupOpSchema = {\n\tdefinitions: {\n\t\trelativePos: mergeTreeRelativePosSchema,\n\t\tdeltaOp: mergeTreeDeltaOpSchema,\n\t\tgroupOp: mergeTreeGroupOpSchema,\n\t},\n\ttype: \"object\",\n\tproperties: {\n\t\taddress: { type: \"string\" },\n\t\tcontents: { $ref: \"#/definitions/groupOp\" },\n\t},\n\trequired: [\"address\", \"contents\"],\n\tadditionalProperties: false,\n};\n"]}
|
package/dist/sanitize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAEH;;;;;;;;;;;;;GAaG;AAEH,4CAAoB;AACpB,sDAA8B;
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAEH;;;;;;;;;;;;;GAaG;AAEH,4CAAoB;AACpB,sDAA8B;AAE9B,2CAAwC;AAExC,SAAS,UAAU;IAClB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CACV,iGAAiG,CACjG,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,iBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,SAAkB,EAAE,MAAe;IACrE,MAAM,KAAK,GAAG,YAAE,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAgC,CAAC;IAElE,MAAM,SAAS,GAAG,IAAI,qBAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;IAE3C,YAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IAEvE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,IAAI;IACZ,IAAI,iBAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,OAAO,QAAQ,CAAC,iBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;KAC/C;IACD,IAAI,iBAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,IAAI,iBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;YACjC,OAAO,QAAQ,CAAC,iBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;SAC9C;QACD,IAAI,iBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE;YACnC,OAAO,QAAQ,CAAC,iBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;SAC9C;KACD;IACD,UAAU,EAAE,CAAC;AACd,CAAC;AAED,IAAI,EAAE,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * This tool cleans up a message.json file downloaded through fluid-fetch to remove\n * user content and user identifying information. Enough information can be retained\n * to allow loading through Fluid Preview, or everything can be scrubbed so that only\n * replay-tool can read the result. Anonymous identifying information such as client\n * IDs are always retained. Object keys are NOT scrubbed, including those that are\n * nested within values (only leaf values are scrubbed).\n *\n * Note: While user content/information is scrubbed, it should not be assumed to be\n * fully anonymized because certain meta-information (such as word lengths and\n * consistent replacement) are preserved.\n *\n * Messages must match known structures when scrubbing for Fluid Preview.\n */\n\nimport fs from \"fs\";\nimport process from \"process\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { Sanitizer } from \"./sanitizer\";\n\nfunction printUsage() {\n\tconsole.log(\"Usage:\");\n\tconsole.log(\" node sanitize [--full | --noBail] <input>\");\n\tconsole.log(\"Where\");\n\tconsole.log(\" [--full] - scrub fully (result cannot be loaded in Fluid Preview)\");\n\tconsole.log(\n\t\t\" [--noBail] - don't bail out when encountering an unknown message format (it won't be scrubbed\",\n\t);\n\tconsole.log(\" <input> - file path to message.json - file downloaded by FluidFetch tool\");\n\tconsole.log(\"Note: <input> is sanitized in place\");\n\tprocess.exit(-1);\n}\n\nfunction Sanitize(msgPath: string, fullScrub: boolean, noBail: boolean) {\n\tconst input = fs.readFileSync(msgPath, { encoding: \"utf-8\" });\n\tconst messages = JSON.parse(input) as ISequencedDocumentMessage[];\n\n\tconst sanitizer = new Sanitizer(messages, fullScrub, noBail, true);\n\tconst cleanMessages = sanitizer.sanitize();\n\n\tfs.writeFileSync(msgPath, JSON.stringify(cleanMessages, undefined, 2));\n\n\tconsole.log(\"Done.\");\n}\n\nfunction main() {\n\tif (process.argv.length === 3) {\n\t\treturn Sanitize(process.argv[2], false, false);\n\t}\n\tif (process.argv.length === 4) {\n\t\tif (process.argv[2] === \"--full\") {\n\t\t\treturn Sanitize(process.argv[3], true, false);\n\t\t}\n\t\tif (process.argv[2] === \"--noBail\") {\n\t\t\treturn Sanitize(process.argv[3], false, true);\n\t\t}\n\t}\n\tprintUsage();\n}\n\nmain();\n"]}
|