@fluidframework/debugger 2.91.0 → 2.92.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/CHANGELOG.md +4 -0
- package/dist/fluidDebugger.d.ts +1 -1
- package/dist/fluidDebugger.d.ts.map +1 -1
- package/dist/fluidDebugger.js.map +1 -1
- package/dist/fluidDebuggerController.d.ts +4 -3
- package/dist/fluidDebuggerController.d.ts.map +1 -1
- package/dist/fluidDebuggerController.js +4 -4
- package/dist/fluidDebuggerController.js.map +1 -1
- package/dist/fluidDebuggerUi.d.ts +1 -1
- package/dist/fluidDebuggerUi.d.ts.map +1 -1
- package/dist/fluidDebuggerUi.js +25 -25
- package/dist/fluidDebuggerUi.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +1 -1
- package/dist/messageSchema.d.ts +1 -1
- package/dist/messageSchema.d.ts.map +1 -1
- package/dist/messageSchema.js.map +1 -1
- package/dist/public.d.ts +1 -1
- package/dist/sanitize.js.map +1 -1
- package/dist/sanitizer.d.ts +1 -1
- package/dist/sanitizer.d.ts.map +1 -1
- package/dist/sanitizer.js +52 -50
- package/dist/sanitizer.js.map +1 -1
- package/eslint.config.mts +13 -4
- package/internal.d.ts +1 -1
- package/legacy.d.ts +1 -1
- package/lib/fluidDebugger.d.ts +1 -1
- package/lib/fluidDebugger.d.ts.map +1 -1
- package/lib/fluidDebugger.js.map +1 -1
- package/lib/fluidDebuggerController.d.ts +4 -3
- package/lib/fluidDebuggerController.d.ts.map +1 -1
- package/lib/fluidDebuggerController.js +4 -4
- package/lib/fluidDebuggerController.js.map +1 -1
- package/lib/fluidDebuggerUi.d.ts +1 -1
- package/lib/fluidDebuggerUi.d.ts.map +1 -1
- package/lib/fluidDebuggerUi.js +25 -25
- package/lib/fluidDebuggerUi.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +1 -1
- package/lib/messageSchema.d.ts +1 -1
- package/lib/messageSchema.d.ts.map +1 -1
- package/lib/messageSchema.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/sanitize.js.map +1 -1
- package/lib/sanitizer.d.ts +1 -1
- package/lib/sanitizer.d.ts.map +1 -1
- package/lib/sanitizer.js +52 -50
- package/lib/sanitizer.js.map +1 -1
- package/package.json +13 -22
- package/src/fluidDebugger.ts +1 -1
- package/src/fluidDebuggerController.ts +10 -8
- package/src/fluidDebuggerUi.ts +26 -26
- package/src/index.ts +2 -2
- package/src/messageSchema.ts +1 -1
- package/src/sanitize.ts +1 -1
- package/src/sanitizer.ts +49 -47
- package/tsconfig.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidDebuggerController.d.ts","sourceRoot":"","sources":["../src/fluidDebuggerController.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAU,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,
|
|
1
|
+
{"version":3,"file":"fluidDebuggerController.d.ts","sourceRoot":"","sources":["../src/fluidDebuggerController.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,16 +63,16 @@ export class DebugReplayController extends ReplayController {
|
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
onSnapshotFileSelection(file) {
|
|
66
|
-
if (!/^snapshot.*\.json/.
|
|
66
|
+
if (!/^snapshot.*\.json/.test(file.name)) {
|
|
67
67
|
alert(`Incorrect file name: ${file.name}`);
|
|
68
68
|
return;
|
|
69
69
|
}
|
|
70
|
-
if (/.*_expanded.*/.
|
|
70
|
+
if (/.*_expanded.*/.test(file.name)) {
|
|
71
71
|
alert(`Incorrect file name - please use non-extended files: ${file.name}`);
|
|
72
72
|
return;
|
|
73
73
|
}
|
|
74
74
|
const reader = new FileReader();
|
|
75
|
-
reader.
|
|
75
|
+
reader.addEventListener("load", () => {
|
|
76
76
|
if (this.documentStorageService) {
|
|
77
77
|
const text = reader.result;
|
|
78
78
|
try {
|
|
@@ -97,7 +97,7 @@ export class DebugReplayController extends ReplayController {
|
|
|
97
97
|
return;
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
|
-
};
|
|
100
|
+
});
|
|
101
101
|
reader.readAsText(file, "utf-8");
|
|
102
102
|
}
|
|
103
103
|
async onDownloadOpsButtonClick(anonymize) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidDebuggerController.js","sourceRoot":"","sources":["../src/fluidDebuggerController.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, Deferred } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIDocumentDeltaStorageService,\n\tIDocumentService,\n\tIDocumentStorageService,\n\tIDocumentAttributes,\n\tISnapshotTree,\n\tIVersion,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { readAndParse } from \"@fluidframework/driver-utils/internal\";\nimport {\n\tFileSnapshotReader,\n\tIFileSnapshot,\n\tReadDocumentStorageServiceBase,\n\tReplayController,\n\tSnapshotStorage,\n} from \"@fluidframework/replay-driver/internal\";\n\nimport { IDebuggerController, IDebuggerUI } from \"./fluidDebuggerUi.js\";\nimport { Sanitizer } from \"./sanitizer.js\";\n\n/**\n * @internal\n */\n// eslint-disable-next-line @rushstack/no-new-null\nexport type debuggerUIFactory = (controller: IDebuggerController) => IDebuggerUI | null;\n\n/**\n * Replay controller that uses pop-up window to control op playback\n * @internal\n */\nexport class DebugReplayController extends ReplayController implements IDebuggerController {\n\t// eslint-disable-next-line @rushstack/no-new-null\n\tpublic static create(createUi: debuggerUIFactory): DebugReplayController | null {\n\t\tif (typeof localStorage === \"object\" && localStorage?.FluidDebugger) {\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\t// TODO Why are we non null asserting here\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(): void {\n\t\tthis.startSeqDeferred.resolve(DebugReplayController.WindowClosedSeq);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\tpublic async onVersionSelection(version: IVersion): Promise<void> {\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): void {\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): void {\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(): boolean {\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\t// Non null asserting here because we are iterating though versions\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\t// eslint-disable-next-line @rushstack/no-new-null\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\t// eslint-disable-next-line @rushstack/no-new-null\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(): Promise<number> {\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\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): void {\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): AsyncGenerator<ISequencedDocumentMessage[], void, undefined> {\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
|
+
{"version":3,"file":"fluidDebuggerController.js","sourceRoot":"","sources":["../src/fluidDebuggerController.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, Deferred } from \"@fluidframework/core-utils/internal\";\nimport type {\n\tIDocumentDeltaStorageService,\n\tIDocumentService,\n\tIDocumentStorageService,\n\tIDocumentAttributes,\n\tISnapshotTree,\n\tIVersion,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { readAndParse } from \"@fluidframework/driver-utils/internal\";\nimport type {\n\tIFileSnapshot,\n\tReadDocumentStorageServiceBase,\n} from \"@fluidframework/replay-driver/internal\";\nimport {\n\tFileSnapshotReader,\n\tReplayController,\n\tSnapshotStorage,\n} from \"@fluidframework/replay-driver/internal\";\n\nimport type { IDebuggerController, IDebuggerUI } from \"./fluidDebuggerUi.js\";\nimport { Sanitizer } from \"./sanitizer.js\";\n\n/**\n * @internal\n */\n// eslint-disable-next-line @rushstack/no-new-null\nexport type debuggerUIFactory = (controller: IDebuggerController) => IDebuggerUI | null;\n\n/**\n * Replay controller that uses pop-up window to control op playback\n * @internal\n */\nexport class DebugReplayController extends ReplayController implements IDebuggerController {\n\t// eslint-disable-next-line @rushstack/no-new-null\n\tpublic static create(createUi: debuggerUIFactory): DebugReplayController | null {\n\t\tif (typeof localStorage === \"object\" && localStorage?.FluidDebugger) {\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\t// TODO Why are we non null asserting here\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(): void {\n\t\tthis.startSeqDeferred.resolve(DebugReplayController.WindowClosedSeq);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\tpublic async onVersionSelection(version: IVersion): Promise<void> {\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): void {\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): void {\n\t\tif (!/^snapshot.*\\.json/.test(file.name)) {\n\t\t\talert(`Incorrect file name: ${file.name}`);\n\t\t\treturn;\n\t\t}\n\t\tif (/.*_expanded.*/.test(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.addEventListener(\"load\", () => {\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(): boolean {\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\t// Non null asserting here because we are iterating though versions\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\t// eslint-disable-next-line @rushstack/no-new-null\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\t// eslint-disable-next-line @rushstack/no-new-null\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(): Promise<number> {\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\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): void {\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): AsyncGenerator<ISequencedDocumentMessage[], void, undefined> {\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"]}
|
package/lib/fluidDebuggerUi.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { IVersion, ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
|
|
5
|
+
import type { IVersion, ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
|
|
6
6
|
/**
|
|
7
7
|
* @internal
|
|
8
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidDebuggerUi.d.ts","sourceRoot":"","sources":["../src/fluidDebuggerUi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"fluidDebuggerUi.d.ts","sourceRoot":"","sources":["../src/fluidDebuggerUi.ts"],"names":[],"mappings":"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"}
|
package/lib/fluidDebuggerUi.js
CHANGED
|
@@ -44,7 +44,7 @@ export class DebuggerUI {
|
|
|
44
44
|
if (typeof window !== "object" ||
|
|
45
45
|
window === null ||
|
|
46
46
|
typeof window.document !== "object" ||
|
|
47
|
-
window.document
|
|
47
|
+
window.document === null) {
|
|
48
48
|
console.log("Can't create debugger window - not running in browser!");
|
|
49
49
|
return null;
|
|
50
50
|
}
|
|
@@ -79,14 +79,14 @@ export class DebuggerUI {
|
|
|
79
79
|
this.controller.onClose();
|
|
80
80
|
}
|
|
81
81
|
}, false);
|
|
82
|
-
this.selector = doc.
|
|
83
|
-
const buttonVers = doc.
|
|
84
|
-
buttonVers.
|
|
82
|
+
this.selector = doc.querySelector("#selector");
|
|
83
|
+
const buttonVers = doc.querySelector("#buttonVers");
|
|
84
|
+
buttonVers.addEventListener("click", () => {
|
|
85
85
|
const index = this.selector.selectedIndex;
|
|
86
86
|
// TODO Why are we non null asserting here
|
|
87
87
|
controller.onVersionSelection(this.versions[index]);
|
|
88
|
-
};
|
|
89
|
-
const fileSnapshot = doc.
|
|
88
|
+
});
|
|
89
|
+
const fileSnapshot = doc.querySelector("#file");
|
|
90
90
|
fileSnapshot.addEventListener("change", () => {
|
|
91
91
|
const files = fileSnapshot.files;
|
|
92
92
|
if (files) {
|
|
@@ -94,10 +94,10 @@ export class DebuggerUI {
|
|
|
94
94
|
controller.onSnapshotFileSelection(files[0]);
|
|
95
95
|
}
|
|
96
96
|
}, false);
|
|
97
|
-
const opDownloadButton = doc.
|
|
98
|
-
const anonymizeCheckbox = doc.
|
|
97
|
+
const opDownloadButton = doc.querySelector("#downloadOps");
|
|
98
|
+
const anonymizeCheckbox = doc.querySelector("#anonymize");
|
|
99
99
|
this.attachDownloadOpsListener(opDownloadButton, anonymizeCheckbox);
|
|
100
|
-
this.versionText = doc.
|
|
100
|
+
this.versionText = doc.querySelector("#versionText");
|
|
101
101
|
this.versionText.textContent = "Fetching snapshots, please wait...";
|
|
102
102
|
controller.connectToUi(this);
|
|
103
103
|
}
|
|
@@ -119,9 +119,9 @@ export class DebuggerUI {
|
|
|
119
119
|
for (const version of versions) {
|
|
120
120
|
const option = document.createElement("option");
|
|
121
121
|
option.text =
|
|
122
|
-
version.date
|
|
123
|
-
? `id = ${version.id}
|
|
124
|
-
: `id = ${version.id}`;
|
|
122
|
+
version.date === undefined
|
|
123
|
+
? `id = ${version.id}`
|
|
124
|
+
: `id = ${version.id}, time = ${version.date}`;
|
|
125
125
|
this.selector.add(option);
|
|
126
126
|
}
|
|
127
127
|
}
|
|
@@ -143,20 +143,20 @@ export class DebuggerUI {
|
|
|
143
143
|
doc.open();
|
|
144
144
|
doc.write(debuggerWindowHtml2);
|
|
145
145
|
doc.close();
|
|
146
|
-
this.lastOpText = doc.
|
|
147
|
-
this.text1 = doc.
|
|
148
|
-
this.text2 = doc.
|
|
149
|
-
this.text3 = doc.
|
|
150
|
-
const steps = doc.
|
|
151
|
-
this.buttonOps = doc.
|
|
146
|
+
this.lastOpText = doc.querySelector("#lastOp");
|
|
147
|
+
this.text1 = doc.querySelector("#text1");
|
|
148
|
+
this.text2 = doc.querySelector("#text2");
|
|
149
|
+
this.text3 = doc.querySelector("#text3");
|
|
150
|
+
const steps = doc.querySelector("#steps");
|
|
151
|
+
this.buttonOps = doc.querySelector("#buttonOps");
|
|
152
152
|
this.buttonOps.disabled = true;
|
|
153
|
-
this.buttonOps.
|
|
153
|
+
this.buttonOps.addEventListener("click", () => {
|
|
154
154
|
this.controller.onOpButtonClick(Number(steps.value));
|
|
155
|
-
};
|
|
156
|
-
this.versionText = doc.
|
|
155
|
+
});
|
|
156
|
+
this.versionText = doc.querySelector("#versionText");
|
|
157
157
|
this.versionText.textContent = text;
|
|
158
|
-
const opDownloadButton = doc.
|
|
159
|
-
const anonymizeCheckbox = doc.
|
|
158
|
+
const opDownloadButton = doc.querySelector("#downloadOps");
|
|
159
|
+
const anonymizeCheckbox = doc.querySelector("#anonymize");
|
|
160
160
|
this.attachDownloadOpsListener(opDownloadButton, anonymizeCheckbox);
|
|
161
161
|
}
|
|
162
162
|
disableNextOpButton(disable) {
|
|
@@ -196,9 +196,9 @@ export class DebuggerUI {
|
|
|
196
196
|
element.setAttribute("href", `data:text/plain;charset=utf-8,${encodeURIComponent(data)}`);
|
|
197
197
|
element.setAttribute("download", filename);
|
|
198
198
|
element.style.display = "none";
|
|
199
|
-
document.body.
|
|
199
|
+
document.body.append(element);
|
|
200
200
|
element.click();
|
|
201
|
-
|
|
201
|
+
element.remove();
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
204
|
//# sourceMappingURL=fluidDebuggerUi.js.map
|
|
@@ -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/core-utils/internal\";\nimport {\n\tIVersion,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\n\n/**\n * @internal\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\n/**\n * @internal\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\n/**\n * @internal\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): string {\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\t// TODO Why are we non null asserting here\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\t// TODO Why are we non null asserting here\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): void {\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[]): void {\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): void {\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): void {\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): void {\n\t\tassert(!!this.buttonOps, 0x088 /* \"Missing button ops button!\" */);\n\t\tthis.buttonOps.disabled = disable;\n\t}\n\n\tpublic updateNextOpText(ops: ISequencedDocumentMessage[]): void {\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\t// Non null asserting here because of the length check above\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): void {\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): void {\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
|
+
{"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/core-utils/internal\";\nimport type {\n\tIVersion,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\n\n/**\n * @internal\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\n/**\n * @internal\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\n/**\n * @internal\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): string {\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.querySelector(\"#selector\") as HTMLSelectElement;\n\n\t\tconst buttonVers = doc.querySelector(\"#buttonVers\") as HTMLDivElement;\n\t\tbuttonVers.addEventListener(\"click\", () => {\n\t\t\tconst index = this.selector!.selectedIndex;\n\t\t\t// TODO Why are we non null asserting here\n\t\t\tcontroller.onVersionSelection(this.versions[index]!);\n\t\t});\n\n\t\tconst fileSnapshot = doc.querySelector(\"#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\t// TODO Why are we non null asserting here\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.querySelector(\"#downloadOps\") as HTMLElement;\n\t\tconst anonymizeCheckbox = doc.querySelector(\"#anonymize\") as HTMLInputElement;\n\t\tthis.attachDownloadOpsListener(opDownloadButton, anonymizeCheckbox);\n\n\t\tthis.versionText = doc.querySelector(\"#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): void {\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[]): void {\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}`\n\t\t\t\t\t\t: `id = ${version.id}, time = ${version.date}`;\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): void {\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): void {\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.querySelector(\"#lastOp\") as HTMLDivElement;\n\t\tthis.text1 = doc.querySelector(\"#text1\") as HTMLDivElement;\n\t\tthis.text2 = doc.querySelector(\"#text2\") as HTMLDivElement;\n\t\tthis.text3 = doc.querySelector(\"#text3\") as HTMLDivElement;\n\n\t\tconst steps = doc.querySelector(\"#steps\") as HTMLInputElement;\n\t\tthis.buttonOps = doc.querySelector(\"#buttonOps\") as HTMLButtonElement;\n\t\tthis.buttonOps.disabled = true;\n\t\tthis.buttonOps.addEventListener(\"click\", () => {\n\t\t\tthis.controller.onOpButtonClick(Number(steps.value));\n\t\t});\n\n\t\tthis.versionText = doc.querySelector(\"#versionText\") as HTMLDivElement;\n\t\tthis.versionText.textContent = text;\n\n\t\tconst opDownloadButton = doc.querySelector(\"#downloadOps\") as HTMLElement;\n\t\tconst anonymizeCheckbox = doc.querySelector(\"#anonymize\") as HTMLInputElement;\n\t\tthis.attachDownloadOpsListener(opDownloadButton, anonymizeCheckbox);\n\t}\n\n\tpublic disableNextOpButton(disable: boolean): void {\n\t\tassert(!!this.buttonOps, 0x088 /* \"Missing button ops button!\" */);\n\t\tthis.buttonOps.disabled = disable;\n\t}\n\n\tpublic updateNextOpText(ops: ISequencedDocumentMessage[]): void {\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\t// Non null asserting here because of the length check above\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): void {\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): void {\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.append(element);\n\n\t\telement.click();\n\n\t\telement.remove();\n\t}\n}\n"]}
|
package/lib/index.d.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
export { FluidDebugger } from "./fluidDebugger.js";
|
|
6
|
-
export { debuggerUIFactory, DebugReplayController } from "./fluidDebuggerController.js";
|
|
7
|
-
export { DebuggerUI, IDebuggerController, IDebuggerUI } from "./fluidDebuggerUi.js";
|
|
6
|
+
export { type debuggerUIFactory, DebugReplayController } from "./fluidDebuggerController.js";
|
|
7
|
+
export { DebuggerUI, type IDebuggerController, type IDebuggerUI } from "./fluidDebuggerUi.js";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,KAAK,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,KAAK,mBAAmB,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAA0B,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC7F,OAAO,EAAE,UAAU,EAA8C,MAAM,sBAAsB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { FluidDebugger } from \"./fluidDebugger.js\";\nexport { type debuggerUIFactory, DebugReplayController } from \"./fluidDebuggerController.js\";\nexport { DebuggerUI, type IDebuggerController, type IDebuggerUI } from \"./fluidDebuggerUi.js\";\n"]}
|
package/lib/legacy.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
/*
|
|
7
7
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints" in @fluid-tools/build-cli.
|
|
8
|
+
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib --node10TypeCompat" in @fluid-tools/build-cli.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
export {
|
package/lib/messageSchema.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { Schema } from "jsonschema";
|
|
5
|
+
import type { Schema } from "jsonschema";
|
|
6
6
|
export declare const joinContentsSchema: {
|
|
7
7
|
type: string;
|
|
8
8
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageSchema.d.ts","sourceRoot":"","sources":["../src/messageSchema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"messageSchema.d.ts","sourceRoot":"","sources":["../src/messageSchema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,eAAO,MAAM,kBAAkB;;CAE9B,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6B1B,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;CAQjC,CAAC;AAGF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwB7B,CAAC;AA2CF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwBhC,CAAC;AAGF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;CASnC,CAAC;AAqBF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC5B,CAAC;AAIF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAuB,CAAC;AAG3D,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8B9C,CAAC;AAGF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqD/B,CAAC;AAiFF,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAY5C,CAAC;AAEF,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAa5C,CAAC"}
|
package/lib/messageSchema.js.map
CHANGED
|
@@ -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\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\ttotalChunks: { type: \"number\" },\n\t},\n\trequired: [\"chunkId\", \"contents\", \"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: [\"act\", \"set\", \"delete\", \"clear\", \"createSubDirectory\", \"deleteSubDirectory\"],\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\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"]}
|
|
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 type { 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\ttotalChunks: { type: \"number\" },\n\t},\n\trequired: [\"chunkId\", \"contents\", \"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: [\"act\", \"set\", \"delete\", \"clear\", \"createSubDirectory\", \"deleteSubDirectory\"],\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\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/lib/public.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
/*
|
|
7
7
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints" in @fluid-tools/build-cli.
|
|
8
|
+
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib --node10TypeCompat" in @fluid-tools/build-cli.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
export {}
|
package/lib/sanitize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,OAAO,MAAM,cAAc,CAAC;AAInC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,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,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,SAAkB,EAAE,MAAe;IACrE,MAAM,KAAK,GAAG,EAAE,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,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;IAE3C,EAAE,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,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,4DAA4D;QAC5D,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,4DAA4D;QAC5D,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;YACpC,4DAA4D;YAC5D,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;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 \"node:fs\";\nimport process from \"node:process\";\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { Sanitizer } from \"./sanitizer.js\";\n\nfunction printUsage(): void {\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): void {\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(): void {\n\tif (process.argv.length === 3) {\n\t\t// Non null asserting here because of the length check above\n\t\treturn Sanitize(process.argv[2]!, false, false);\n\t}\n\tif (process.argv.length === 4) {\n\t\t// Non null asserting here because of the length check above\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\t// Non null asserting here because of the length check above\n\t\t\treturn Sanitize(process.argv[3]!, false, true);\n\t\t}\n\t}\n\tprintUsage();\n}\n\nmain();\n"]}
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,OAAO,MAAM,cAAc,CAAC;AAInC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,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,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,SAAkB,EAAE,MAAe;IACrE,MAAM,KAAK,GAAG,EAAE,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,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;IAE3C,EAAE,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,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,4DAA4D;QAC5D,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,4DAA4D;QAC5D,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;YACpC,4DAA4D;YAC5D,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;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 \"node:fs\";\nimport process from \"node:process\";\n\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { Sanitizer } from \"./sanitizer.js\";\n\nfunction printUsage(): void {\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): void {\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(): void {\n\tif (process.argv.length === 3) {\n\t\t// Non null asserting here because of the length check above\n\t\treturn Sanitize(process.argv[2]!, false, false);\n\t}\n\tif (process.argv.length === 4) {\n\t\t// Non null asserting here because of the length check above\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\t// Non null asserting here because of the length check above\n\t\t\treturn Sanitize(process.argv[3]!, false, true);\n\t\t}\n\t}\n\tprintUsage();\n}\n\nmain();\n"]}
|
package/lib/sanitizer.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
|
|
5
|
+
import type { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
|
|
6
6
|
import * as Validator from "jsonschema";
|
|
7
7
|
declare enum TextType {
|
|
8
8
|
Generic = 0,
|
package/lib/sanitizer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitizer.d.ts","sourceRoot":"","sources":["../src/sanitizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"sanitizer.d.ts","sourceRoot":"","sources":["../src/sanitizer.ts"],"names":[],"mappings":"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"}
|