@fluidframework/debugger 2.0.0-dev.2.2.0.111723 → 2.0.0-dev.3.1.0.125672
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +9 -11
- package/README.md +33 -33
- package/api-extractor.json +2 -2
- package/dist/fluidDebugger.d.ts.map +1 -1
- package/dist/fluidDebugger.js.map +1 -1
- package/dist/fluidDebuggerController.d.ts.map +1 -1
- package/dist/fluidDebuggerController.js +5 -2
- package/dist/fluidDebuggerController.js.map +1 -1
- package/dist/fluidDebuggerUi.d.ts.map +1 -1
- package/dist/fluidDebuggerUi.js +11 -5
- package/dist/fluidDebuggerUi.js.map +1 -1
- package/dist/messageSchema.js.map +1 -1
- package/dist/sanitize.js.map +1 -1
- package/dist/sanitizer.d.ts.map +1 -1
- package/dist/sanitizer.js +9 -10
- package/dist/sanitizer.js.map +1 -1
- package/lib/fluidDebugger.d.ts.map +1 -1
- package/lib/fluidDebugger.js.map +1 -1
- package/lib/fluidDebuggerController.d.ts.map +1 -1
- package/lib/fluidDebuggerController.js +5 -2
- package/lib/fluidDebuggerController.js.map +1 -1
- package/lib/fluidDebuggerUi.d.ts.map +1 -1
- package/lib/fluidDebuggerUi.js +11 -5
- package/lib/fluidDebuggerUi.js.map +1 -1
- package/lib/messageSchema.js.map +1 -1
- package/lib/sanitize.js.map +1 -1
- package/lib/sanitizer.d.ts.map +1 -1
- package/lib/sanitizer.js +9 -10
- package/lib/sanitizer.js.map +1 -1
- package/package.json +15 -14
- package/prettier.config.cjs +1 -1
- package/src/fluidDebugger.ts +30 -30
- package/src/fluidDebuggerController.ts +348 -322
- package/src/fluidDebuggerUi.ts +306 -281
- package/src/messageSchema.ts +367 -367
- package/src/sanitize.ts +29 -29
- package/src/sanitizer.ts +699 -643
- package/tsconfig.esnext.json +6 -6
- package/tsconfig.json +10 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidDebuggerUi.js","sourceRoot":"","sources":["../src/fluidDebuggerUi.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage, IVersion } from \"@fluidframework/protocol-definitions\";\n\nexport interface IDebuggerUI {\n /**\n * Version information is provided.\n * Expect updates (information about seq#, timestamp) through updateVersion() calls\n */\n addVersions(version: IVersion[]): void;\n\n /**\n * Call when new version is downloaded from storage\n * Expect multiple callbacks.\n */\n updateVersion(index: number, version: IVersion, seqNumber: number): void;\n\n /**\n * Called in response to successful onVersionSelection() or onSnapshotFileSelection() call\n * and provides extra information about selection.\n * It expected that UI layer would change its mode as result of this call, i.e. switch to\n * displaying op playback controls (if this is supported)\n * Note: There maybe no call to versionSelected() in response to onSnapshotFileSelection() call\n * if file does not exist, has wrong name of wrong format.\n * @param version - version, file name, or undefined if playing ops.\n */\n versionSelected(seqNumber: number, version: IVersion | string): void;\n\n /**\n * Called by controller in response to new ops being downloaded\n * Called with disable = true if there are no (currently) ops to play\n */\n disableNextOpButton(disable: boolean): void;\n\n /**\n * Called by controller when new ops arrive (or we are done playing previous batch)\n * Indicates next batch of ops that would be played when UI calls controller's onOpButtonClick()\n * Called with ops=[] when there are no ops to play.\n */\n updateNextOpText(ops: ISequencedDocumentMessage[]): void;\n\n /**\n * Called periodically when new versions are downloaded from server\n */\n updateVersionText(versionsLeft: number): void;\n\n /**\n * Called periodically to notify about last known op\n * @param lastKnownOp - seq number of last known op. -1 if can't play ops in this mode (load from file)\n * @param stillLoading - true if we did not reach yet the end of the stream\n */\n updateLastOpText(lastKnownOp: number, stillLoading: boolean): void;\n}\n\nexport interface IDebuggerController {\n /**\n * Initialization. UI layers calls into controller to connect the two.\n * @param ui - UI layer\n */\n connectToUi(ui: IDebuggerUI);\n\n /**\n * Called by UI layer when debugger window is closed by user\n * If called before user makes selection of snapshot/file, original\n * document service is returned to loader (instead of debugger service) and normal document load continues.\n */\n onClose(): void;\n\n /**\n * UI Layer notifies about selection of version to continue.\n * On successful load, versionSelected() is called.\n * @param version - Snapshot version to start from.\n */\n onVersionSelection(version: IVersion): void;\n\n /**\n * UI Layer notifies about selection of version to continue.\n * On successful load, versionSelected() is called.\n * @param version - File to load snapshot from\n */\n onSnapshotFileSelection(file: File): void;\n\n /**\n * \"next op\" button is clicked in the UI\n * @param steps - number of ops to play.\n */\n onOpButtonClick(steps: number): void;\n\n /**\n * \"Download ops\" option is clicked in the UI. Returns JSON of the full opStream when available.\n * @param anonymize - anonymize the ops json using the sanitization tool\n */\n onDownloadOpsButtonClick(anonymize: boolean): Promise<string>;\n}\n\nconst debuggerWindowHtml =\n `<Title>Fluid Debugger</Title>\n<body>\n<h3>Fluid Debugger</h3>\nPlease select snapshot or file to start with<br/>\nClose debugger window to proceed to live document<br/><br/>\n<select style='width:250px' id='selector'>\n</select>\n \n<button id='buttonVers' style='width:60px'>Go</button><br/>\n<input id='file' type='file' value='Load from file'/>\n<br/><br/>\n<h4>Download the current document's ops</h4>\n<input type='checkbox' id='anonymize' value='Anonymize'>\n<label for='anonymize'>Anonymize</label>\n<button type='button' id='downloadOps'>Download ops</button>\n<br/><br/><div id='versionText'></div>\n</body>`;\n\nconst debuggerWindowHtml2 =\n `<Title>Fluid Debugger</Title>\n<body>\n<h3>Fluid Debugger</h3>\n<div id='versionText'></div>\n<div id='lastOp'></div>\n<br/>\nStep to move: <input type='number' id='steps' value='1' min='1' style='width:50px'/>\n <button id='buttonOps' style='width:60px'>Go</button>\n<br/><br/>\n<div id='text1'></div><div id='text2'></div><div id='text3'></div>\n<br/>\n<h4>Download the current document's ops</h4>\n<input type='checkbox' id='anonymize' value='Anonymize'>\n<label for='anonymize'>Anonymize</label>\n<button type='button' id='downloadOps'>Download ops</button>\n</body>`;\n\nexport class DebuggerUI {\n public static create(controller: IDebuggerController): DebuggerUI | null {\n if (\n typeof window !== \"object\" ||\n window === null ||\n typeof window.document !== \"object\" ||\n window.document == null) {\n console.log(\"Can't create debugger window - not running in browser!\");\n return null;\n }\n\n const debuggerWindow = window.open(\n \"\",\n \"\",\n \"width=400,height=400,resizable=yes,location=no,menubar=no,titlebar=no,status=no,toolbar=no\");\n if (!debuggerWindow) {\n console.error(\"Can't create debugger window - please enable pop-up windows in your browser!\");\n return null;\n }\n\n return new DebuggerUI(controller, debuggerWindow);\n }\n\n private static formatDate(date: number) {\n // Alternative - without timezone\n // new Date().toLocaleString('default', { timeZone: 'UTC'}));\n // new Date().toLocaleString('default', { year: 'numeric', month: 'short',\n // day: 'numeric', hour: '2-digit', minute: 'numeric', second: 'numeric' }));\n return new Date(date).toUTCString();\n }\n\n protected selector?: HTMLSelectElement;\n protected versionText: HTMLDivElement;\n\n protected buttonOps?: HTMLButtonElement;\n protected text1?: HTMLDivElement;\n protected text2?: HTMLDivElement;\n protected text3?: HTMLDivElement;\n protected lastOpText?: HTMLDivElement;\n protected wasVersionSelected = false;\n protected versions: IVersion[] = [];\n\n protected documentClosed = false;\n\n protected constructor(private readonly controller: IDebuggerController, private readonly debuggerWindow: Window) {\n const doc = this.debuggerWindow.document;\n doc.write(debuggerWindowHtml);\n\n window.addEventListener(\"beforeunload\", (e) => {\n this.documentClosed = true;\n this.debuggerWindow.close();\n }, false);\n\n this.debuggerWindow.addEventListener(\"beforeunload\", (e) => {\n if (!this.documentClosed) {\n this.controller.onClose();\n }\n }, false);\n\n this.selector = doc.getElementById(\"selector\") as HTMLSelectElement;\n\n const buttonVers = doc.getElementById(\"buttonVers\") as HTMLDivElement;\n buttonVers.onclick = () => {\n const index = this.selector!.selectedIndex;\n controller.onVersionSelection(this.versions[index]);\n };\n\n const fileSnapshot = doc.getElementById(\"file\") as HTMLInputElement;\n fileSnapshot.addEventListener(\"change\", () => {\n const files = fileSnapshot.files;\n if (files) {\n controller.onSnapshotFileSelection(files[0]);\n }\n }, false);\n\n const opDownloadButton = doc.getElementById(\"downloadOps\") as HTMLElement;\n const anonymizeCheckbox = doc.getElementById(\"anonymize\") as HTMLInputElement;\n this.attachDownloadOpsListener(opDownloadButton, anonymizeCheckbox);\n\n this.versionText = doc.getElementById(\"versionText\") as HTMLDivElement;\n this.versionText.textContent = \"Fetching snapshots, please wait...\";\n\n controller.connectToUi(this);\n }\n\n private attachDownloadOpsListener(element: HTMLElement, anonymize: HTMLInputElement) {\n element.addEventListener(\"click\", () => {\n this.controller.onDownloadOpsButtonClick(anonymize.checked).then((opJson) => {\n this.download(\"opStream.json\", opJson);\n }).catch((error) => { console.log(`Error downloading ops: ${error}`); });\n });\n }\n\n public addVersions(versions: IVersion[]) {\n if (this.selector) {\n this.versions = versions;\n for (const version of versions) {\n const option = document.createElement(\"option\");\n option.text = version.date !== undefined\n ? `id = ${version.id}, time = ${version.date}`\n : `id = ${version.id}`;\n this.selector.add(option);\n }\n }\n }\n\n public updateVersion(index: number, version: IVersion, seqNumber: number) {\n if (this.selector) {\n const option = this.selector[index] as HTMLOptionElement;\n option.text = `${option.text}, seq = ${seqNumber}`;\n this.selector[index] = option;\n }\n }\n\n public versionSelected(seqNumber: number, version: IVersion | string) {\n const text = typeof version === \"string\"\n ? `Playing ${version} file`\n : `Playing from ${version.id}, seq# ${seqNumber}`;\n\n this.wasVersionSelected = true;\n this.selector = undefined;\n\n const doc = this.debuggerWindow.document;\n doc.open();\n doc.write(debuggerWindowHtml2);\n doc.close();\n\n this.lastOpText = doc.getElementById(\"lastOp\") as HTMLDivElement;\n this.text1 = doc.getElementById(\"text1\") as HTMLDivElement;\n this.text2 = doc.getElementById(\"text2\") as HTMLDivElement;\n this.text3 = doc.getElementById(\"text3\") as HTMLDivElement;\n\n const steps = doc.getElementById(\"steps\") as HTMLInputElement;\n this.buttonOps = doc.getElementById(\"buttonOps\") as HTMLButtonElement;\n this.buttonOps.disabled = true;\n this.buttonOps.onclick = () => {\n this.controller.onOpButtonClick(Number(steps.value));\n };\n\n this.versionText = doc.getElementById(\"versionText\") as HTMLDivElement;\n this.versionText.textContent = text;\n\n const opDownloadButton = doc.getElementById(\"downloadOps\") as HTMLElement;\n const anonymizeCheckbox = doc.getElementById(\"anonymize\") as HTMLInputElement;\n this.attachDownloadOpsListener(opDownloadButton, anonymizeCheckbox);\n }\n\n public disableNextOpButton(disable: boolean) {\n assert(!!this.buttonOps, 0x088 /* \"Missing button ops button!\" */);\n this.buttonOps.disabled = disable;\n }\n\n public updateNextOpText(ops: ISequencedDocumentMessage[]) {\n if (ops.length === 0) {\n this.text1!.textContent = \"\";\n this.text2!.textContent = \"\";\n this.text3!.textContent = \"\";\n } else {\n const op = ops[0];\n const seq = op.sequenceNumber;\n const date = DebuggerUI.formatDate(op.timestamp);\n this.text1!.textContent = `Next op seq#: ${seq}`;\n this.text2!.textContent = `Type: ${op.type}`;\n this.text3!.textContent = `${date}`;\n }\n }\n\n public updateVersionText(versionCount: number) {\n if (!this.wasVersionSelected) {\n const text = versionCount === 0 ? \"\" : `Fetching information about ${versionCount} snapshots...`;\n this.versionText.textContent = text;\n }\n }\n\n public updateLastOpText(lastKnownOp: number, stillLoading: boolean) {\n const text = stillLoading\n ? `Last op (still loading): ${lastKnownOp}`\n : `Document's last op seq#: ${lastKnownOp}`;\n this.lastOpText!.textContent = text;\n }\n\n private download(filename: string, data: string): void {\n const element = document.createElement(\"a\");\n element.setAttribute(\"href\", `data:text/plain;charset=utf-8,${ encodeURIComponent(data) }`);\n element.setAttribute(\"download\", filename);\n\n element.style.display = \"none\";\n document.body.appendChild(element);\n\n element.click();\n\n document.body.removeChild(element);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fluidDebuggerUi.js","sourceRoot":"","sources":["../src/fluidDebuggerUi.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage, IVersion } from \"@fluidframework/protocol-definitions\";\n\nexport interface IDebuggerUI {\n\t/**\n\t * Version information is provided.\n\t * Expect updates (information about seq#, timestamp) through updateVersion() calls\n\t */\n\taddVersions(version: IVersion[]): void;\n\n\t/**\n\t * Call when new version is downloaded from storage\n\t * Expect multiple callbacks.\n\t */\n\tupdateVersion(index: number, version: IVersion, seqNumber: number): void;\n\n\t/**\n\t * Called in response to successful onVersionSelection() or onSnapshotFileSelection() call\n\t * and provides extra information about selection.\n\t * It expected that UI layer would change its mode as result of this call, i.e. switch to\n\t * displaying op playback controls (if this is supported)\n\t * Note: There maybe no call to versionSelected() in response to onSnapshotFileSelection() call\n\t * if file does not exist, has wrong name of wrong format.\n\t * @param version - version, file name, or undefined if playing ops.\n\t */\n\tversionSelected(seqNumber: number, version: IVersion | string): void;\n\n\t/**\n\t * Called by controller in response to new ops being downloaded\n\t * Called with disable = true if there are no (currently) ops to play\n\t */\n\tdisableNextOpButton(disable: boolean): void;\n\n\t/**\n\t * Called by controller when new ops arrive (or we are done playing previous batch)\n\t * Indicates next batch of ops that would be played when UI calls controller's onOpButtonClick()\n\t * Called with ops=[] when there are no ops to play.\n\t */\n\tupdateNextOpText(ops: ISequencedDocumentMessage[]): void;\n\n\t/**\n\t * Called periodically when new versions are downloaded from server\n\t */\n\tupdateVersionText(versionsLeft: number): void;\n\n\t/**\n\t * Called periodically to notify about last known op\n\t * @param lastKnownOp - seq number of last known op. -1 if can't play ops in this mode (load from file)\n\t * @param stillLoading - true if we did not reach yet the end of the stream\n\t */\n\tupdateLastOpText(lastKnownOp: number, stillLoading: boolean): void;\n}\n\nexport interface IDebuggerController {\n\t/**\n\t * Initialization. UI layers calls into controller to connect the two.\n\t * @param ui - UI layer\n\t */\n\tconnectToUi(ui: IDebuggerUI);\n\n\t/**\n\t * Called by UI layer when debugger window is closed by user\n\t * If called before user makes selection of snapshot/file, original\n\t * document service is returned to loader (instead of debugger service) and normal document load continues.\n\t */\n\tonClose(): void;\n\n\t/**\n\t * UI Layer notifies about selection of version to continue.\n\t * On successful load, versionSelected() is called.\n\t * @param version - Snapshot version to start from.\n\t */\n\tonVersionSelection(version: IVersion): void;\n\n\t/**\n\t * UI Layer notifies about selection of version to continue.\n\t * On successful load, versionSelected() is called.\n\t * @param version - File to load snapshot from\n\t */\n\tonSnapshotFileSelection(file: File): void;\n\n\t/**\n\t * \"next op\" button is clicked in the UI\n\t * @param steps - number of ops to play.\n\t */\n\tonOpButtonClick(steps: number): void;\n\n\t/**\n\t * \"Download ops\" option is clicked in the UI. Returns JSON of the full opStream when available.\n\t * @param anonymize - anonymize the ops json using the sanitization tool\n\t */\n\tonDownloadOpsButtonClick(anonymize: boolean): Promise<string>;\n}\n\nconst debuggerWindowHtml = `<Title>Fluid Debugger</Title>\n<body>\n<h3>Fluid Debugger</h3>\nPlease select snapshot or file to start with<br/>\nClose debugger window to proceed to live document<br/><br/>\n<select style='width:250px' id='selector'>\n</select>\n \n<button id='buttonVers' style='width:60px'>Go</button><br/>\n<input id='file' type='file' value='Load from file'/>\n<br/><br/>\n<h4>Download the current document's ops</h4>\n<input type='checkbox' id='anonymize' value='Anonymize'>\n<label for='anonymize'>Anonymize</label>\n<button type='button' id='downloadOps'>Download ops</button>\n<br/><br/><div id='versionText'></div>\n</body>`;\n\nconst debuggerWindowHtml2 = `<Title>Fluid Debugger</Title>\n<body>\n<h3>Fluid Debugger</h3>\n<div id='versionText'></div>\n<div id='lastOp'></div>\n<br/>\nStep to move: <input type='number' id='steps' value='1' min='1' style='width:50px'/>\n <button id='buttonOps' style='width:60px'>Go</button>\n<br/><br/>\n<div id='text1'></div><div id='text2'></div><div id='text3'></div>\n<br/>\n<h4>Download the current document's ops</h4>\n<input type='checkbox' id='anonymize' value='Anonymize'>\n<label for='anonymize'>Anonymize</label>\n<button type='button' id='downloadOps'>Download ops</button>\n</body>`;\n\nexport class DebuggerUI {\n\tpublic static create(controller: IDebuggerController): DebuggerUI | null {\n\t\tif (\n\t\t\ttypeof window !== \"object\" ||\n\t\t\twindow === null ||\n\t\t\ttypeof window.document !== \"object\" ||\n\t\t\twindow.document == null\n\t\t) {\n\t\t\tconsole.log(\"Can't create debugger window - not running in browser!\");\n\t\t\treturn null;\n\t\t}\n\n\t\tconst debuggerWindow = window.open(\n\t\t\t\"\",\n\t\t\t\"\",\n\t\t\t\"width=400,height=400,resizable=yes,location=no,menubar=no,titlebar=no,status=no,toolbar=no\",\n\t\t);\n\t\tif (!debuggerWindow) {\n\t\t\tconsole.error(\n\t\t\t\t\"Can't create debugger window - please enable pop-up windows in your browser!\",\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn new DebuggerUI(controller, debuggerWindow);\n\t}\n\n\tprivate static formatDate(date: number) {\n\t\t// Alternative - without timezone\n\t\t// new Date().toLocaleString('default', { timeZone: 'UTC'}));\n\t\t// new Date().toLocaleString('default', { year: 'numeric', month: 'short',\n\t\t// day: 'numeric', hour: '2-digit', minute: 'numeric', second: 'numeric' }));\n\t\treturn new Date(date).toUTCString();\n\t}\n\n\tprotected selector?: HTMLSelectElement;\n\tprotected versionText: HTMLDivElement;\n\n\tprotected buttonOps?: HTMLButtonElement;\n\tprotected text1?: HTMLDivElement;\n\tprotected text2?: HTMLDivElement;\n\tprotected text3?: HTMLDivElement;\n\tprotected lastOpText?: HTMLDivElement;\n\tprotected wasVersionSelected = false;\n\tprotected versions: IVersion[] = [];\n\n\tprotected documentClosed = false;\n\n\tprotected constructor(\n\t\tprivate readonly controller: IDebuggerController,\n\t\tprivate readonly debuggerWindow: Window,\n\t) {\n\t\tconst doc = this.debuggerWindow.document;\n\t\tdoc.write(debuggerWindowHtml);\n\n\t\twindow.addEventListener(\n\t\t\t\"beforeunload\",\n\t\t\t(e) => {\n\t\t\t\tthis.documentClosed = true;\n\t\t\t\tthis.debuggerWindow.close();\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\n\t\tthis.debuggerWindow.addEventListener(\n\t\t\t\"beforeunload\",\n\t\t\t(e) => {\n\t\t\t\tif (!this.documentClosed) {\n\t\t\t\t\tthis.controller.onClose();\n\t\t\t\t}\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\n\t\tthis.selector = doc.getElementById(\"selector\") as HTMLSelectElement;\n\n\t\tconst buttonVers = doc.getElementById(\"buttonVers\") as HTMLDivElement;\n\t\tbuttonVers.onclick = () => {\n\t\t\tconst index = this.selector!.selectedIndex;\n\t\t\tcontroller.onVersionSelection(this.versions[index]);\n\t\t};\n\n\t\tconst fileSnapshot = doc.getElementById(\"file\") as HTMLInputElement;\n\t\tfileSnapshot.addEventListener(\n\t\t\t\"change\",\n\t\t\t() => {\n\t\t\t\tconst files = fileSnapshot.files;\n\t\t\t\tif (files) {\n\t\t\t\t\tcontroller.onSnapshotFileSelection(files[0]);\n\t\t\t\t}\n\t\t\t},\n\t\t\tfalse,\n\t\t);\n\n\t\tconst opDownloadButton = doc.getElementById(\"downloadOps\") as HTMLElement;\n\t\tconst anonymizeCheckbox = doc.getElementById(\"anonymize\") as HTMLInputElement;\n\t\tthis.attachDownloadOpsListener(opDownloadButton, anonymizeCheckbox);\n\n\t\tthis.versionText = doc.getElementById(\"versionText\") as HTMLDivElement;\n\t\tthis.versionText.textContent = \"Fetching snapshots, please wait...\";\n\n\t\tcontroller.connectToUi(this);\n\t}\n\n\tprivate attachDownloadOpsListener(element: HTMLElement, anonymize: HTMLInputElement) {\n\t\telement.addEventListener(\"click\", () => {\n\t\t\tthis.controller\n\t\t\t\t.onDownloadOpsButtonClick(anonymize.checked)\n\t\t\t\t.then((opJson) => {\n\t\t\t\t\tthis.download(\"opStream.json\", opJson);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.log(`Error downloading ops: ${error}`);\n\t\t\t\t});\n\t\t});\n\t}\n\n\tpublic addVersions(versions: IVersion[]) {\n\t\tif (this.selector) {\n\t\t\tthis.versions = versions;\n\t\t\tfor (const version of versions) {\n\t\t\t\tconst option = document.createElement(\"option\");\n\t\t\t\toption.text =\n\t\t\t\t\tversion.date !== undefined\n\t\t\t\t\t\t? `id = ${version.id}, time = ${version.date}`\n\t\t\t\t\t\t: `id = ${version.id}`;\n\t\t\t\tthis.selector.add(option);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic updateVersion(index: number, version: IVersion, seqNumber: number) {\n\t\tif (this.selector) {\n\t\t\tconst option = this.selector[index] as HTMLOptionElement;\n\t\t\toption.text = `${option.text}, seq = ${seqNumber}`;\n\t\t\tthis.selector[index] = option;\n\t\t}\n\t}\n\n\tpublic versionSelected(seqNumber: number, version: IVersion | string) {\n\t\tconst text =\n\t\t\ttypeof version === \"string\"\n\t\t\t\t? `Playing ${version} file`\n\t\t\t\t: `Playing from ${version.id}, seq# ${seqNumber}`;\n\n\t\tthis.wasVersionSelected = true;\n\t\tthis.selector = undefined;\n\n\t\tconst doc = this.debuggerWindow.document;\n\t\tdoc.open();\n\t\tdoc.write(debuggerWindowHtml2);\n\t\tdoc.close();\n\n\t\tthis.lastOpText = doc.getElementById(\"lastOp\") as HTMLDivElement;\n\t\tthis.text1 = doc.getElementById(\"text1\") as HTMLDivElement;\n\t\tthis.text2 = doc.getElementById(\"text2\") as HTMLDivElement;\n\t\tthis.text3 = doc.getElementById(\"text3\") as HTMLDivElement;\n\n\t\tconst steps = doc.getElementById(\"steps\") as HTMLInputElement;\n\t\tthis.buttonOps = doc.getElementById(\"buttonOps\") as HTMLButtonElement;\n\t\tthis.buttonOps.disabled = true;\n\t\tthis.buttonOps.onclick = () => {\n\t\t\tthis.controller.onOpButtonClick(Number(steps.value));\n\t\t};\n\n\t\tthis.versionText = doc.getElementById(\"versionText\") as HTMLDivElement;\n\t\tthis.versionText.textContent = text;\n\n\t\tconst opDownloadButton = doc.getElementById(\"downloadOps\") as HTMLElement;\n\t\tconst anonymizeCheckbox = doc.getElementById(\"anonymize\") as HTMLInputElement;\n\t\tthis.attachDownloadOpsListener(opDownloadButton, anonymizeCheckbox);\n\t}\n\n\tpublic disableNextOpButton(disable: boolean) {\n\t\tassert(!!this.buttonOps, 0x088 /* \"Missing button ops button!\" */);\n\t\tthis.buttonOps.disabled = disable;\n\t}\n\n\tpublic updateNextOpText(ops: ISequencedDocumentMessage[]) {\n\t\tif (ops.length === 0) {\n\t\t\tthis.text1!.textContent = \"\";\n\t\t\tthis.text2!.textContent = \"\";\n\t\t\tthis.text3!.textContent = \"\";\n\t\t} else {\n\t\t\tconst op = ops[0];\n\t\t\tconst seq = op.sequenceNumber;\n\t\t\tconst date = DebuggerUI.formatDate(op.timestamp);\n\t\t\tthis.text1!.textContent = `Next op seq#: ${seq}`;\n\t\t\tthis.text2!.textContent = `Type: ${op.type}`;\n\t\t\tthis.text3!.textContent = `${date}`;\n\t\t}\n\t}\n\n\tpublic updateVersionText(versionCount: number) {\n\t\tif (!this.wasVersionSelected) {\n\t\t\tconst text =\n\t\t\t\tversionCount === 0 ? \"\" : `Fetching information about ${versionCount} snapshots...`;\n\t\t\tthis.versionText.textContent = text;\n\t\t}\n\t}\n\n\tpublic updateLastOpText(lastKnownOp: number, stillLoading: boolean) {\n\t\tconst text = stillLoading\n\t\t\t? `Last op (still loading): ${lastKnownOp}`\n\t\t\t: `Document's last op seq#: ${lastKnownOp}`;\n\t\tthis.lastOpText!.textContent = text;\n\t}\n\n\tprivate download(filename: string, data: string): void {\n\t\tconst element = document.createElement(\"a\");\n\t\telement.setAttribute(\"href\", `data:text/plain;charset=utf-8,${encodeURIComponent(data)}`);\n\t\telement.setAttribute(\"download\", filename);\n\n\t\telement.style.display = \"none\";\n\t\tdocument.body.appendChild(element);\n\n\t\telement.click();\n\n\t\tdocument.body.removeChild(element);\n\t}\n}\n"]}
|
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 type: \"null\",\n};\n\nexport const joinDataSchema = {\n type: \"object\",\n properties: {\n clientId: { type: \"string\" },\n detail: {\n type: \"object\",\n properties: {\n details: { type: \"object\" },\n mode: { type: \"string\" },\n permission: { type: \"array\" },\n scopes: { type: \"array\" },\n type: { type: \"string\" },\n user: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n name: { type: \"string\" },\n email: { type: \"string\" },\n },\n required: [\"id\", \"name\", \"email\"],\n additionalProperties: false,\n },\n },\n required: [\"user\"],\n additionalProperties: false,\n },\n },\n required: [\"clientId\", \"detail\"],\n additionalProperties: false,\n};\n\nexport const proposeContentsSchema = {\n type: [\"string\", \"object\"],\n properties: {\n key: { type: \"string\" },\n value: { type: \"string\" },\n },\n required: [\"key\"],\n additionalProperties: false,\n};\n\n// The parsed json of a propose message's contents value\nexport const proposeCodeSchema = {\n type: \"object\",\n properties: {\n key: { type: \"string\" },\n value: {\n type: \"object\",\n properties: {\n package: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n version: { type: \"string\" },\n fluid: { type: \"object\" },\n },\n required: [\"name\"],\n },\n config: { type: \"object\" },\n },\n required: [\"package\", \"config\"],\n additionalProperties: false,\n },\n },\n required: [\"key\", \"value\"],\n additionalProperties: false,\n};\n\n// This also needs to be in the root \"definitions\" key as \"entries\" to be used\nconst attachSnapshotEntriesSchema = {\n type: \"object\",\n properties: {\n mode: { type: \"string\" },\n path: { type: \"string\" },\n type: { enum: [\"Blob\", \"Tree\"] },\n value: {\n type: \"object\",\n oneOf: [\n // type Blob\n {\n properties: {\n contents: { type: \"string\" },\n encoding: { type: \"string\" },\n // Verify this\n id: { type: \"null\" },\n },\n required: [\"contents\", \"encoding\"],\n additionalProperties: false,\n },\n // type Tree\n {\n properties: {\n entries: {\n type: \"array\",\n items: { $ref: \"#/definitions/entries\" },\n },\n // Verify this\n id: { type: \"null\" },\n },\n required: [\"entries\"],\n additionalProperties: false,\n },\n ],\n },\n },\n required: [\"mode\", \"path\", \"type\", \"value\"],\n additionalProperties: false,\n};\n\nexport const attachContentsSchema = {\n definitions: {\n entries: attachSnapshotEntriesSchema,\n },\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n snapshot: {\n type: \"object\",\n properties: {\n entries: {\n type: \"array\",\n items: { $ref: \"#/definitions/entries\" },\n },\n // Verify this\n id: { type: \"null\" },\n },\n required: [\"entries\"],\n additionalProperties: false,\n },\n type: { type: \"string\" },\n },\n required: [\"id\", \"snapshot\", \"type\"],\n additionalProperties: false,\n};\n\n// can exist at the root level or within an op\nexport const chunkedOpContentsSchema = {\n type: \"object\",\n properties: {\n chunkId: { type: \"number\" },\n contents: { type: \"string\" },\n originalType: { type: \"string\" },\n totalChunks: { type: \"number\" },\n },\n required: [\"chunkId\", \"contents\", \"originalType\", \"totalChunks\"],\n additionalProperties: false,\n};\n\nconst contentsSchema = {\n type: \"object\",\n properties: {\n address: { type: \"string\" },\n contents: {\n type: \"object\",\n properties: {\n content: { type: \"object\" },\n type: { type: \"string\" },\n },\n required: [\"content\", \"type\"],\n additionalProperties: false,\n },\n },\n required: [\"address\", \"contents\"],\n additionalProperties: false,\n};\n\n// special contents formats from containerRuntime.ts's ContainerMessageType\nexport const opContentsSchema = {\n definitions: {\n content: contentsSchema,\n entries: attachSnapshotEntriesSchema,\n attachContents: attachContentsSchema,\n chunkedOpContents: chunkedOpContentsSchema,\n },\n type: \"object\",\n oneOf: [\n {\n properties: {\n type: { enum: [\"component\"] },\n contents: { $ref: \"#/definitions/content\" },\n },\n required: [\"type\", \"contents\"],\n additionalProperties: false,\n },\n {\n properties: {\n type: { enum: [\"attach\"] },\n contents: { $ref: \"#/definitions/attachContents\" },\n },\n required: [\"type\", \"contents\"],\n additionalProperties: false,\n },\n {\n properties: {\n type: { enum: [\"chunkedOp\"] },\n contents: { $ref: \"#/definitions/chunkedOpContents\" },\n },\n required: [\"type\", \"contents\"],\n additionalProperties: false,\n },\n {\n $ref: \"#/definitions/content\",\n },\n ],\n};\n\n// \"op\" message's contents.contents.content schemas\n\nexport const opContentsAttachSchema = attachContentsSchema;\n\n// Ops from dds/register-collection's consensusRegisterCollection\nexport const opContentsRegisterCollectionSchema = {\n type: \"object\",\n properties: {\n address: { type: \"string\" },\n contents: {\n type: \"object\",\n properties: {\n key: { type: \"string\" },\n refSeq: { type: \"number\" },\n serializedValue: { type: \"string\" },\n value: {\n type: \"object\",\n properties: {\n type: { type: \"string\" },\n value: { },\n },\n required: [\"type\", \"value\"],\n additionalProperties: false,\n },\n type: {\n type: \"string\",\n enum: [\"write\"],\n },\n },\n required: [\"key\", \"type\"],\n additionalProperties: false,\n },\n },\n required: [\"address\", \"contents\"],\n additionalProperties: false,\n};\n\n// Ops from dds/map's directory.ts\nexport const opContentsMapSchema = {\n type: \"object\",\n properties: {\n address: { type: \"string\" },\n contents: {\n type: \"object\",\n properties: {\n key: { type: \"string\" },\n path: { type: \"string\" },\n subdirName: { type: \"string\" },\n value: {\n type: \"object\",\n properties: {\n type: { type: \"string\" },\n value: { },\n },\n required: [\"type\"],\n additionalProperties: false,\n },\n type: {\n type: \"string\",\n enum: [\n \"act\",\n \"set\",\n \"delete\",\n \"clear\",\n \"createSubDirectory\",\n \"deleteSubDirectory\",\n ],\n },\n },\n required: [\"type\"],\n additionalProperties: false,\n // specific property combinations based on type value\n oneOf: [\n {\n properties: { type: { enum: [\"act\"] } },\n required: [\"key\", \"path\", \"value\"],\n },\n {\n properties: { type: { enum: [\"set\"] } },\n required: [\"key\", \"value\"],\n },\n {\n properties: { type: { enum: [\"delete\"] } },\n required: [\"key\"],\n },\n {\n properties: { type: { enum: [\"clear\"] } },\n required: [\"path\"],\n },\n {\n properties: { type: { enum: [\"createSubDirectory\", \"deleteSubDirectory\"] } },\n required: [\"path\", \"subdirName\"],\n },\n ],\n },\n },\n required: [\"address\", \"contents\"],\n additionalProperties: false,\n};\n\n// from dds/merge-tree's ops.ts and opBuilder.ts\n// Note: written op objects in opBuilder.ts are more restrictive than their\n// corresponding interface definitions in ops.ts, and the more restrictive\n// schema are used here\nconst mergeTreeRelativePosSchema = {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n before: { type: \"boolean\" },\n offset: { type: \"number\" },\n },\n additionalProperties: false,\n};\n\nconst mergeTreeDeltaOpSchema = {\n type: \"object\",\n properties: {\n type: {\n type: \"number\",\n minimum: 0 /* MergeTreeDeltaType.INSERT */,\n maximum: 2 /* MergeTreeDeltaType.ANNOTATE */,\n },\n },\n required: [\"type\"],\n oneOf: [\n {\n properties: {\n type: { enum: [0] },\n seg: { type: [\"string\", \"object\"] },\n pos1: { type: \"number\" },\n },\n required: [\"pos1\"],\n additionalProperties: false,\n },\n {\n properties: {\n type: { enum: [1] },\n register: { type: \"string\" },\n pos1: { type: \"number\" },\n pos2: { type: \"number\" },\n },\n required: [\"pos1\"],\n additionalProperties: false,\n },\n {\n properties: {\n type: { enum: [2] },\n combiningOp: {\n type: \"object\",\n properties: {\n defaultValue: { },\n maxValue: { },\n minValue: { },\n name: { type: \"string\" },\n },\n required: [\"name\"],\n additionalProperties: false,\n },\n pos1: { type: \"number\" },\n pos2: { type: \"number\" },\n props: { type: \"object\" },\n register: { type: \"string\" },\n relativePos1: { $ref: \"#/definitions/relativePos\" },\n relativePos2: { $ref: \"#/definitions/relativePos\" },\n },\n required: [\"props\"],\n additionalProperties: false,\n },\n // There's something weird with the typings/settings here where this doesn't get\n // recognized as a valid Schema array if more than 1 item has \"properties\" defined\n ] as Schema[],\n};\n\nconst mergeTreeGroupOpSchema = {\n type: \"object\",\n properties: {\n ops: {\n type: \"array\",\n items: { $ref: \"#/definitions/deltaOp\" },\n },\n type: {\n type: \"number\",\n minimum: 3 /* MergeTreeDeltaType.GROUP */,\n maximum: 3 /* MergeTreeDeltaType.GROUP */,\n },\n },\n required: [\"ops\", \"type\"],\n additionalProperties: false,\n};\n\nexport const opContentsMergeTreeDeltaOpSchema = {\n definitions: {\n relativePos: mergeTreeRelativePosSchema,\n deltaOp: mergeTreeDeltaOpSchema,\n },\n type: \"object\",\n properties: {\n address: { type: \"string\" },\n contents: { $ref: \"#/definitions/deltaOp\" },\n },\n required: [\"address\", \"contents\"],\n additionalProperties: false,\n};\n\nexport const opContentsMergeTreeGroupOpSchema = {\n definitions: {\n relativePos: mergeTreeRelativePosSchema,\n deltaOp: mergeTreeDeltaOpSchema,\n groupOp: mergeTreeGroupOpSchema,\n },\n type: \"object\",\n properties: {\n address: { type: \"string\" },\n contents: { $ref: \"#/definitions/groupOp\" },\n },\n required: [\"address\", \"contents\"],\n additionalProperties: false,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"messageSchema.js","sourceRoot":"","sources":["../src/messageSchema.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Schema } from \"jsonschema\";\n\nexport const joinContentsSchema = {\n\ttype: \"null\",\n};\n\nexport const joinDataSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tclientId: { type: \"string\" },\n\t\tdetail: {\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tdetails: { type: \"object\" },\n\t\t\t\tmode: { type: \"string\" },\n\t\t\t\tpermission: { type: \"array\" },\n\t\t\t\tscopes: { type: \"array\" },\n\t\t\t\ttype: { type: \"string\" },\n\t\t\t\tuser: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tid: { type: \"string\" },\n\t\t\t\t\t\tname: { type: \"string\" },\n\t\t\t\t\t\temail: { type: \"string\" },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"id\", \"name\", \"email\"],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t},\n\t\t\trequired: [\"user\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t},\n\trequired: [\"clientId\", \"detail\"],\n\tadditionalProperties: false,\n};\n\nexport const proposeContentsSchema = {\n\ttype: [\"string\", \"object\"],\n\tproperties: {\n\t\tkey: { type: \"string\" },\n\t\tvalue: { type: \"string\" },\n\t},\n\trequired: [\"key\"],\n\tadditionalProperties: false,\n};\n\n// The parsed json of a propose message's contents value\nexport const proposeCodeSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tkey: { type: \"string\" },\n\t\tvalue: {\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tpackage: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tname: { type: \"string\" },\n\t\t\t\t\t\tversion: { type: \"string\" },\n\t\t\t\t\t\tfluid: { type: \"object\" },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"name\"],\n\t\t\t\t},\n\t\t\t\tconfig: { type: \"object\" },\n\t\t\t},\n\t\t\trequired: [\"package\", \"config\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t},\n\trequired: [\"key\", \"value\"],\n\tadditionalProperties: false,\n};\n\n// This also needs to be in the root \"definitions\" key as \"entries\" to be used\nconst attachSnapshotEntriesSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tmode: { type: \"string\" },\n\t\tpath: { type: \"string\" },\n\t\ttype: { enum: [\"Blob\", \"Tree\"] },\n\t\tvalue: {\n\t\t\ttype: \"object\",\n\t\t\toneOf: [\n\t\t\t\t// type Blob\n\t\t\t\t{\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tcontents: { type: \"string\" },\n\t\t\t\t\t\tencoding: { type: \"string\" },\n\t\t\t\t\t\t// Verify this\n\t\t\t\t\t\tid: { type: \"null\" },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"contents\", \"encoding\"],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t\t// type Tree\n\t\t\t\t{\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tentries: {\n\t\t\t\t\t\t\ttype: \"array\",\n\t\t\t\t\t\t\titems: { $ref: \"#/definitions/entries\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Verify this\n\t\t\t\t\t\tid: { type: \"null\" },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"entries\"],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n\trequired: [\"mode\", \"path\", \"type\", \"value\"],\n\tadditionalProperties: false,\n};\n\nexport const attachContentsSchema = {\n\tdefinitions: {\n\t\tentries: attachSnapshotEntriesSchema,\n\t},\n\ttype: \"object\",\n\tproperties: {\n\t\tid: { type: \"string\" },\n\t\tsnapshot: {\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tentries: {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\titems: { $ref: \"#/definitions/entries\" },\n\t\t\t\t},\n\t\t\t\t// Verify this\n\t\t\t\tid: { type: \"null\" },\n\t\t\t},\n\t\t\trequired: [\"entries\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\ttype: { type: \"string\" },\n\t},\n\trequired: [\"id\", \"snapshot\", \"type\"],\n\tadditionalProperties: false,\n};\n\n// can exist at the root level or within an op\nexport const chunkedOpContentsSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tchunkId: { type: \"number\" },\n\t\tcontents: { type: \"string\" },\n\t\toriginalType: { type: \"string\" },\n\t\ttotalChunks: { type: \"number\" },\n\t},\n\trequired: [\"chunkId\", \"contents\", \"originalType\", \"totalChunks\"],\n\tadditionalProperties: false,\n};\n\nconst contentsSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\taddress: { type: \"string\" },\n\t\tcontents: {\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tcontent: { type: \"object\" },\n\t\t\t\ttype: { type: \"string\" },\n\t\t\t},\n\t\t\trequired: [\"content\", \"type\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t},\n\trequired: [\"address\", \"contents\"],\n\tadditionalProperties: false,\n};\n\n// special contents formats from containerRuntime.ts's ContainerMessageType\nexport const opContentsSchema = {\n\tdefinitions: {\n\t\tcontent: contentsSchema,\n\t\tentries: attachSnapshotEntriesSchema,\n\t\tattachContents: attachContentsSchema,\n\t\tchunkedOpContents: chunkedOpContentsSchema,\n\t},\n\ttype: \"object\",\n\toneOf: [\n\t\t{\n\t\t\tproperties: {\n\t\t\t\ttype: { enum: [\"component\"] },\n\t\t\t\tcontents: { $ref: \"#/definitions/content\" },\n\t\t\t},\n\t\t\trequired: [\"type\", \"contents\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\t{\n\t\t\tproperties: {\n\t\t\t\ttype: { enum: [\"attach\"] },\n\t\t\t\tcontents: { $ref: \"#/definitions/attachContents\" },\n\t\t\t},\n\t\t\trequired: [\"type\", \"contents\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\t{\n\t\t\tproperties: {\n\t\t\t\ttype: { enum: [\"chunkedOp\"] },\n\t\t\t\tcontents: { $ref: \"#/definitions/chunkedOpContents\" },\n\t\t\t},\n\t\t\trequired: [\"type\", \"contents\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\t{\n\t\t\t$ref: \"#/definitions/content\",\n\t\t},\n\t],\n};\n\n// \"op\" message's contents.contents.content schemas\n\nexport const opContentsAttachSchema = attachContentsSchema;\n\n// Ops from dds/register-collection's consensusRegisterCollection\nexport const opContentsRegisterCollectionSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\taddress: { type: \"string\" },\n\t\tcontents: {\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tkey: { type: \"string\" },\n\t\t\t\trefSeq: { type: \"number\" },\n\t\t\t\tserializedValue: { type: \"string\" },\n\t\t\t\tvalue: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\ttype: { type: \"string\" },\n\t\t\t\t\t\tvalue: {},\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"type\", \"value\"],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t\ttype: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tenum: [\"write\"],\n\t\t\t\t},\n\t\t\t},\n\t\t\trequired: [\"key\", \"type\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t},\n\trequired: [\"address\", \"contents\"],\n\tadditionalProperties: false,\n};\n\n// Ops from dds/map's directory.ts\nexport const opContentsMapSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\taddress: { type: \"string\" },\n\t\tcontents: {\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tkey: { type: \"string\" },\n\t\t\t\tpath: { type: \"string\" },\n\t\t\t\tsubdirName: { type: \"string\" },\n\t\t\t\tvalue: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\ttype: { type: \"string\" },\n\t\t\t\t\t\tvalue: {},\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"type\"],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t\ttype: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tenum: [\n\t\t\t\t\t\t\"act\",\n\t\t\t\t\t\t\"set\",\n\t\t\t\t\t\t\"delete\",\n\t\t\t\t\t\t\"clear\",\n\t\t\t\t\t\t\"createSubDirectory\",\n\t\t\t\t\t\t\"deleteSubDirectory\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\trequired: [\"type\"],\n\t\t\tadditionalProperties: false,\n\t\t\t// specific property combinations based on type value\n\t\t\toneOf: [\n\t\t\t\t{\n\t\t\t\t\tproperties: { type: { enum: [\"act\"] } },\n\t\t\t\t\trequired: [\"key\", \"path\", \"value\"],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tproperties: { type: { enum: [\"set\"] } },\n\t\t\t\t\trequired: [\"key\", \"value\"],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tproperties: { type: { enum: [\"delete\"] } },\n\t\t\t\t\trequired: [\"key\"],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tproperties: { type: { enum: [\"clear\"] } },\n\t\t\t\t\trequired: [\"path\"],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tproperties: { type: { enum: [\"createSubDirectory\", \"deleteSubDirectory\"] } },\n\t\t\t\t\trequired: [\"path\", \"subdirName\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n\trequired: [\"address\", \"contents\"],\n\tadditionalProperties: false,\n};\n\n// from dds/merge-tree's ops.ts and opBuilder.ts\n// Note: written op objects in opBuilder.ts are more restrictive than their\n// corresponding interface definitions in ops.ts, and the more restrictive\n// schema are used here\nconst mergeTreeRelativePosSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tid: { type: \"string\" },\n\t\tbefore: { type: \"boolean\" },\n\t\toffset: { type: \"number\" },\n\t},\n\tadditionalProperties: false,\n};\n\nconst mergeTreeDeltaOpSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\ttype: {\n\t\t\ttype: \"number\",\n\t\t\tminimum: 0 /* MergeTreeDeltaType.INSERT */,\n\t\t\tmaximum: 2 /* MergeTreeDeltaType.ANNOTATE */,\n\t\t},\n\t},\n\trequired: [\"type\"],\n\toneOf: [\n\t\t{\n\t\t\tproperties: {\n\t\t\t\ttype: { enum: [0] },\n\t\t\t\tseg: { type: [\"string\", \"object\"] },\n\t\t\t\tpos1: { type: \"number\" },\n\t\t\t},\n\t\t\trequired: [\"pos1\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\t{\n\t\t\tproperties: {\n\t\t\t\ttype: { enum: [1] },\n\t\t\t\tregister: { type: \"string\" },\n\t\t\t\tpos1: { type: \"number\" },\n\t\t\t\tpos2: { type: \"number\" },\n\t\t\t},\n\t\t\trequired: [\"pos1\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\t{\n\t\t\tproperties: {\n\t\t\t\ttype: { enum: [2] },\n\t\t\t\tcombiningOp: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tdefaultValue: {},\n\t\t\t\t\t\tmaxValue: {},\n\t\t\t\t\t\tminValue: {},\n\t\t\t\t\t\tname: { type: \"string\" },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [\"name\"],\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t\tpos1: { type: \"number\" },\n\t\t\t\tpos2: { type: \"number\" },\n\t\t\t\tprops: { type: \"object\" },\n\t\t\t\tregister: { type: \"string\" },\n\t\t\t\trelativePos1: { $ref: \"#/definitions/relativePos\" },\n\t\t\t\trelativePos2: { $ref: \"#/definitions/relativePos\" },\n\t\t\t},\n\t\t\trequired: [\"props\"],\n\t\t\tadditionalProperties: false,\n\t\t},\n\t\t// There's something weird with the typings/settings here where this doesn't get\n\t\t// recognized as a valid Schema array if more than 1 item has \"properties\" defined\n\t] as Schema[],\n};\n\nconst mergeTreeGroupOpSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tops: {\n\t\t\ttype: \"array\",\n\t\t\titems: { $ref: \"#/definitions/deltaOp\" },\n\t\t},\n\t\ttype: {\n\t\t\ttype: \"number\",\n\t\t\tminimum: 3 /* MergeTreeDeltaType.GROUP */,\n\t\t\tmaximum: 3 /* MergeTreeDeltaType.GROUP */,\n\t\t},\n\t},\n\trequired: [\"ops\", \"type\"],\n\tadditionalProperties: false,\n};\n\nexport const opContentsMergeTreeDeltaOpSchema = {\n\tdefinitions: {\n\t\trelativePos: mergeTreeRelativePosSchema,\n\t\tdeltaOp: mergeTreeDeltaOpSchema,\n\t},\n\ttype: \"object\",\n\tproperties: {\n\t\taddress: { type: \"string\" },\n\t\tcontents: { $ref: \"#/definitions/deltaOp\" },\n\t},\n\trequired: [\"address\", \"contents\"],\n\tadditionalProperties: false,\n};\n\nexport const opContentsMergeTreeGroupOpSchema = {\n\tdefinitions: {\n\t\trelativePos: mergeTreeRelativePosSchema,\n\t\tdeltaOp: mergeTreeDeltaOpSchema,\n\t\tgroupOp: mergeTreeGroupOpSchema,\n\t},\n\ttype: \"object\",\n\tproperties: {\n\t\taddress: { type: \"string\" },\n\t\tcontents: { $ref: \"#/definitions/groupOp\" },\n\t},\n\trequired: [\"address\", \"contents\"],\n\tadditionalProperties: false,\n};\n"]}
|
package/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,IAAI,CAAC;AACpB,OAAO,OAAO,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,SAAS,UAAU;IAClB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CACV,iGAAiG,CACjG,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,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;QAC9B,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;KAC/C;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;YACjC,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;SAC9C;QACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE;YACnC,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;SAC9C;KACD;IACD,UAAU,EAAE,CAAC;AACd,CAAC;AAED,IAAI,EAAE,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * This tool cleans up a message.json file downloaded through fluid-fetch to remove\n * user content and user identifying information. Enough information can be retained\n * to allow loading through Fluid Preview, or everything can be scrubbed so that only\n * replay-tool can read the result. Anonymous identifying information such as client\n * IDs are always retained. Object keys are NOT scrubbed, including those that are\n * nested within values (only leaf values are scrubbed).\n *\n * Note: While user content/information is scrubbed, it should not be assumed to be\n * fully anonymized because certain meta-information (such as word lengths and\n * consistent replacement) are preserved.\n *\n * Messages must match known structures when scrubbing for Fluid Preview.\n */\n\nimport fs from \"fs\";\nimport process from \"process\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { Sanitizer } from \"./sanitizer\";\n\nfunction printUsage() {\n\tconsole.log(\"Usage:\");\n\tconsole.log(\" node sanitize [--full | --noBail] <input>\");\n\tconsole.log(\"Where\");\n\tconsole.log(\" [--full] - scrub fully (result cannot be loaded in Fluid Preview)\");\n\tconsole.log(\n\t\t\" [--noBail] - don't bail out when encountering an unknown message format (it won't be scrubbed\",\n\t);\n\tconsole.log(\" <input> - file path to message.json - file downloaded by FluidFetch tool\");\n\tconsole.log(\"Note: <input> is sanitized in place\");\n\tprocess.exit(-1);\n}\n\nfunction Sanitize(msgPath: string, fullScrub: boolean, noBail: boolean) {\n\tconst input = fs.readFileSync(msgPath, { encoding: \"utf-8\" });\n\tconst messages = JSON.parse(input) as ISequencedDocumentMessage[];\n\n\tconst sanitizer = new Sanitizer(messages, fullScrub, noBail, true);\n\tconst cleanMessages = sanitizer.sanitize();\n\n\tfs.writeFileSync(msgPath, JSON.stringify(cleanMessages, undefined, 2));\n\n\tconsole.log(\"Done.\");\n}\n\nfunction main() {\n\tif (process.argv.length === 3) {\n\t\treturn Sanitize(process.argv[2], false, false);\n\t}\n\tif (process.argv.length === 4) {\n\t\tif (process.argv[2] === \"--full\") {\n\t\t\treturn Sanitize(process.argv[3], true, false);\n\t\t}\n\t\tif (process.argv[2] === \"--noBail\") {\n\t\t\treturn Sanitize(process.argv[3], false, true);\n\t\t}\n\t}\n\tprintUsage();\n}\n\nmain();\n"]}
|
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;AAEH;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AAExC,OAAO,
|
|
1
|
+
{"version":3,"file":"sanitizer.d.ts","sourceRoot":"","sources":["../src/sanitizer.ts"],"names":[],"mappings":"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"}
|
package/lib/sanitizer.js
CHANGED
|
@@ -31,7 +31,9 @@ var TextType;
|
|
|
31
31
|
// that matches nothing
|
|
32
32
|
const falseResult = {
|
|
33
33
|
valid: false,
|
|
34
|
-
toString: () => {
|
|
34
|
+
toString: () => {
|
|
35
|
+
return "Unmatched format";
|
|
36
|
+
},
|
|
35
37
|
};
|
|
36
38
|
/**
|
|
37
39
|
* Class that takes chunkedOp messages and can provide their concatenated
|
|
@@ -87,7 +89,8 @@ class ChunkedOpProcessor {
|
|
|
87
89
|
}
|
|
88
90
|
hasAllMessages() {
|
|
89
91
|
const lastMsgContents = this.parsedMessageContents[this.parsedMessageContents.length - 1];
|
|
90
|
-
return lastMsgContents.chunkId !== undefined &&
|
|
92
|
+
return (lastMsgContents.chunkId !== undefined &&
|
|
93
|
+
lastMsgContents.chunkId === lastMsgContents.totalChunks);
|
|
91
94
|
}
|
|
92
95
|
/**
|
|
93
96
|
* @returns The concatenated contents of all the messages parsed as json
|
|
@@ -98,7 +101,6 @@ class ChunkedOpProcessor {
|
|
|
98
101
|
}, "");
|
|
99
102
|
this.concatenatedLength = contentsString.length;
|
|
100
103
|
try {
|
|
101
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
102
104
|
return JSON.parse(contentsString);
|
|
103
105
|
}
|
|
104
106
|
catch (e) {
|
|
@@ -262,7 +264,6 @@ export class Sanitizer {
|
|
|
262
264
|
input[i] = this.replaceObject(value);
|
|
263
265
|
}
|
|
264
266
|
}
|
|
265
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
266
267
|
return input;
|
|
267
268
|
}
|
|
268
269
|
/**
|
|
@@ -271,7 +272,6 @@ export class Sanitizer {
|
|
|
271
272
|
* @param input - The object to sanitize
|
|
272
273
|
* @param excludedKeys - object keys for which to skip replacement when not in fullScrub
|
|
273
274
|
*/
|
|
274
|
-
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
275
275
|
replaceObject(input, excludedKeys = this.defaultExcludedKeys) {
|
|
276
276
|
// File might contain actual nulls
|
|
277
277
|
if (input === null || input === undefined) {
|
|
@@ -302,7 +302,6 @@ export class Sanitizer {
|
|
|
302
302
|
*/
|
|
303
303
|
replaceAny(input, excludedKeys = this.defaultExcludedKeys) {
|
|
304
304
|
if (input === null || input === undefined) {
|
|
305
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
306
305
|
return input;
|
|
307
306
|
}
|
|
308
307
|
if (typeof input === "string") {
|
|
@@ -316,7 +315,6 @@ export class Sanitizer {
|
|
|
316
315
|
return this.replaceObject(input, excludedKeys);
|
|
317
316
|
}
|
|
318
317
|
// Don't run replacement on any other types
|
|
319
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
320
318
|
return input;
|
|
321
319
|
}
|
|
322
320
|
fixJoin(message) {
|
|
@@ -436,9 +434,10 @@ export class Sanitizer {
|
|
|
436
434
|
}
|
|
437
435
|
}
|
|
438
436
|
fixDeltaOp(deltaOp) {
|
|
439
|
-
deltaOp.seg =
|
|
440
|
-
|
|
441
|
-
|
|
437
|
+
deltaOp.seg =
|
|
438
|
+
typeof deltaOp.seg === "string"
|
|
439
|
+
? this.replaceText(deltaOp.seg)
|
|
440
|
+
: this.replaceObject(deltaOp.seg, this.mergeTreeExcludedKeys);
|
|
442
441
|
}
|
|
443
442
|
/**
|
|
444
443
|
* Fix the contents object for an op message. Does not do extra type handling. Does
|
package/lib/sanitizer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitizer.js","sourceRoot":"","sources":["../src/sanitizer.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\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 * as Validator from \"jsonschema\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport {\n ISequencedDocumentMessage,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n attachContentsSchema,\n chunkedOpContentsSchema,\n joinContentsSchema,\n joinDataSchema,\n opContentsMapSchema,\n opContentsSchema,\n opContentsMergeTreeDeltaOpSchema,\n opContentsMergeTreeGroupOpSchema,\n opContentsRegisterCollectionSchema,\n proposeContentsSchema,\n} from \"./messageSchema\";\n\nenum TextType {\n Generic,\n Email,\n Name,\n FluidObject,\n MapKey,\n}\n\n// Workaround to jsonschema package not supporting \"false\" as a schema\n// that matches nothing\nconst falseResult = {\n valid: false,\n toString: () => { return \"Unmatched format\"; },\n};\n\n/**\n * Class that takes chunkedOp messages and can provide their concatenated\n * contents along with re-write sanitized content in-place back into the\n * messages. Assumes sanitized messages are always less than or equal in\n * size to the original message.\n */\nclass ChunkedOpProcessor {\n /**\n * Message references so we can replace their contents in-place. These can\n * be top-level chunkedOp messages, or top-level op messages with a chunkedOp\n * within the contents\n */\n private messages = new Array<any>();\n /**\n * The messages' parsed contents for processing. Should parallel the\n * messages member\n */\n private parsedMessageContents = new Array<any>();\n private writtenBack = false;\n /**\n * keep track of the total starting length to make sure we don't somehow end\n * up with more content than we started with (meaning we may not be able to\n * write it back)\n */\n private concatenatedLength = 0;\n\n constructor(\n readonly validateSchemaFn: (object: any, schema: any) => boolean,\n readonly debug: boolean,\n ) { }\n\n debugMsg(msg: any) {\n if (this.debug) {\n console.error(msg);\n }\n }\n\n addMessage(message: any): void {\n this.messages.push(message);\n\n let parsed;\n try {\n parsed = JSON.parse(message.contents);\n if (message.type === \"op\") {\n // nested within a regular op\n // need to go deeper to get the desired contents\n parsed = parsed.contents;\n }\n } catch (e) {\n this.debugMsg(e);\n this.debugMsg(message.contents);\n }\n this.validateSchemaFn(parsed, chunkedOpContentsSchema);\n this.parsedMessageContents.push(parsed);\n }\n\n hasAllMessages(): boolean {\n const lastMsgContents = this.parsedMessageContents[this.parsedMessageContents.length - 1];\n return lastMsgContents.chunkId !== undefined && lastMsgContents.chunkId === lastMsgContents.totalChunks;\n }\n\n /**\n * @returns The concatenated contents of all the messages parsed as json\n */\n getConcatenatedContents(): any {\n const contentsString = this.parsedMessageContents.reduce((previousValue: string, currentValue: any) => {\n return previousValue + (currentValue.contents as string);\n }, \"\");\n\n this.concatenatedLength = contentsString.length;\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return JSON.parse(contentsString);\n } catch (e) {\n this.debugMsg(contentsString);\n this.debugMsg(e);\n return undefined;\n }\n }\n\n /**\n * Write back sanitized contents into the messages. The contents are\n * stringified, split up, and written in place to the messages that\n * were added earlier. The number of messages is preserved.\n * @param contents - Sanitized contents to write back\n */\n writeSanitizedContents(contents: any): void {\n // Write back a chunk size equal to the original\n const chunkSize = this.parsedMessageContents[0].contents.length;\n\n let stringified: string;\n try {\n stringified = JSON.stringify(contents);\n assert(stringified.length <= this.concatenatedLength,\n 0x089 /* \"Stringified length of chunk contents > total starting length\" */);\n } catch (e) {\n this.debugMsg(e);\n throw e;\n }\n\n for (let i = 0; i < this.messages.length; i++) {\n const substring = stringified.substring(i * chunkSize, (i + 1) * chunkSize);\n\n const parsedContents = this.parsedMessageContents[i];\n parsedContents.contents = substring;\n const message = this.messages[i];\n\n let stringifiedParsedContents;\n try {\n // for nested chunkedOps, we need to recreate the extra nesting layer\n // we removed earlier when adding the message\n if (message.type === \"op\") {\n const nestingLayer = {\n type: \"chunkedOp\",\n contents: parsedContents,\n };\n stringifiedParsedContents = JSON.stringify(nestingLayer);\n } else {\n stringifiedParsedContents = JSON.stringify(parsedContents);\n }\n } catch (e) {\n this.debugMsg(e);\n }\n\n message.contents = stringifiedParsedContents;\n }\n\n this.writtenBack = true;\n }\n\n reset(): void {\n assert(this.writtenBack, 0x08a /* \"resetting ChunkedOpProcessor that never wrote back its contents\" */);\n this.messages = new Array<any>();\n this.parsedMessageContents = new Array<any>();\n this.writtenBack = false;\n this.concatenatedLength = 0;\n }\n\n isPendingProcessing(): boolean {\n return this.messages.length !== 0;\n }\n}\n\nexport class Sanitizer {\n readonly validator = new Validator.Validator();\n // Represents the keys used to store Fluid object identifiers, snapshot info,\n // and other string fields that should not be replaced in contents blobs to\n // ensure the messages are still usable\n readonly defaultExcludedKeys = new Set<string>();\n // Represents the keys used by merge-tree ops their \"seg\" property, where other\n // keys represent user information\n readonly mergeTreeExcludedKeys = new Set<string>();\n // Map of user information to what it was replaced with. Used to ensure the same\n // data have the same replacements\n readonly replacementMap = new Map<string, string>();\n\n /**\n * Validate that the provided message matches the provided schema.\n * For a full scrub, warn and continue (scrubber should fully sanitize unexpected\n * fields for ops), otherwise throw an error because we cannot be sure user\n * information is being sufficiently sanitized.\n */\n objectMatchesSchema = (object: any, schema: any): boolean => {\n const result = schema === false ? falseResult : this.validator.validate(object, schema);\n if (!result.valid) {\n const errorMsg = `Bad msg fmt:\\n${result.toString()}\\n${JSON.stringify(object, undefined, 2)}`;\n\n if (this.fullScrub || this.noBail) {\n this.debugMsg(errorMsg);\n } else {\n throw new Error(errorMsg);\n }\n }\n return result.valid;\n };\n\n readonly chunkProcessor = new ChunkedOpProcessor(this.objectMatchesSchema, this.debug);\n\n constructor(\n readonly messages: ISequencedDocumentMessage[],\n readonly fullScrub: boolean,\n readonly noBail: boolean,\n readonly debug: boolean = false,\n ) {\n this.defaultExcludedKeys.add(\"type\");\n this.defaultExcludedKeys.add(\"id\");\n this.defaultExcludedKeys.add(\"pkg\");\n this.defaultExcludedKeys.add(\"snapshotFormatVersion\");\n this.defaultExcludedKeys.add(\"packageVersion\");\n this.mergeTreeExcludedKeys.add(\"nodeType\");\n }\n\n debugMsg(msg: any) {\n if (this.debug) {\n console.error(msg);\n }\n }\n\n isFluidObjectKey(key: string): boolean {\n return key === \"type\" || key === \"id\";\n }\n\n getRandomText(len: number): string {\n let str = \"\";\n while (str.length < len) {\n str = str + Math.random().toString(36).substring(2);\n }\n return str.substr(0, len);\n }\n\n readonly wordTokenRegex = /\\S+/g;\n\n readonly replaceRandomTextFn = (match: string): string => {\n if (this.replacementMap.has(match)) {\n return this.replacementMap.get(match)!;\n }\n\n const replacement = this.getRandomText(match.length);\n this.replacementMap.set(match, replacement);\n return replacement;\n };\n\n /**\n * Replace text with garbage. FluidObject types are not replaced when not under\n * full scrub mode. All other text is replaced consistently.\n */\n replaceText(input?: string, type: TextType = TextType.Generic): string | undefined {\n if (input === undefined) {\n return undefined;\n }\n\n if (type === TextType.FluidObject) {\n if (this.replacementMap.has(input)) {\n return this.replacementMap.get(input)!;\n }\n\n const replacement = this.fullScrub ? this.getRandomText(input.length) : input;\n\n this.replacementMap.set(input, replacement);\n return replacement;\n }\n\n return input.replace(this.wordTokenRegex, this.replaceRandomTextFn);\n }\n\n replaceArray(input: any[]): any[] {\n for (let i = 0; i < input.length; i++) {\n const value = input[i];\n if (typeof value === \"string\") {\n input[i] = this.replaceText(value);\n } else if (Array.isArray(value)) {\n input[i] = this.replaceArray(value);\n } else if (typeof value === \"object\") {\n input[i] = this.replaceObject(value);\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return input;\n }\n\n /**\n * (sort of) recurses down the values of a JSON object to sanitize all its strings\n * (only checks strings, arrays, and objects)\n * @param input - The object to sanitize\n * @param excludedKeys - object keys for which to skip replacement when not in fullScrub\n */\n // eslint-disable-next-line @typescript-eslint/ban-types\n replaceObject(input: object | null, excludedKeys: Set<string> = this.defaultExcludedKeys): object | null {\n // File might contain actual nulls\n if (input === null || input === undefined) {\n return input;\n }\n\n const keys = Object.keys(input);\n keys.forEach((key) => {\n if (this.fullScrub || !excludedKeys.has(key)) {\n const value = input[key];\n if (typeof value === \"string\") {\n input[key] = this.replaceText(\n value,\n this.isFluidObjectKey(key) ? TextType.FluidObject : TextType.Generic,\n );\n } else if (Array.isArray(value)) {\n input[key] = this.replaceArray(value);\n } else if (typeof value === \"object\") {\n input[key] = this.replaceObject(value, excludedKeys);\n }\n }\n });\n return input;\n }\n\n /**\n * Replacement on an unknown type or a parsed root level object\n * without a key\n * @param input - The object to sanitize\n * @param excludedKeys - object keys for which to skip replacement when not in fullScrub\n */\n replaceAny(input: any, excludedKeys: Set<string> = this.defaultExcludedKeys): any {\n if (input === null || input === undefined) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return input;\n }\n\n if (typeof input === \"string\") {\n return this.replaceText(input);\n } else if (Array.isArray(input)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.replaceArray(input);\n } else if (typeof input === \"object\") {\n return this.replaceObject(input, excludedKeys);\n }\n\n // Don't run replacement on any other types\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return input;\n }\n\n fixJoin(message: any) {\n if (!this.objectMatchesSchema(message.contents, joinContentsSchema)) {\n message.contents = this.replaceAny(message.contents);\n }\n\n try {\n let data = JSON.parse(message.data);\n if (!this.objectMatchesSchema(data, joinDataSchema)) {\n data = this.replaceAny(data);\n } else {\n const user = data.detail.user;\n user.id = this.replaceText(user.id, TextType.Email);\n user.email = this.replaceText(user.email, TextType.Email);\n user.name = this.replaceText(user.name, TextType.Name);\n }\n\n message.data = JSON.stringify(data);\n } catch (e) {\n this.debugMsg(e);\n }\n }\n\n fixPropose(message: any) {\n if (!this.objectMatchesSchema(message.contents, proposeContentsSchema)) {\n message.contents = this.replaceAny(message.contents);\n } else {\n if (typeof message.contents === \"string\") {\n try {\n const data = JSON.parse(message.contents);\n if (this.fullScrub) {\n const pkg = data.value?.package;\n if (pkg?.name) {\n pkg.name = this.replaceText(pkg.name, TextType.FluidObject);\n }\n if (Array.isArray(pkg?.fluid?.browser?.umd?.files)) {\n pkg.fluid.browser.umd.files = this.replaceArray(pkg.fluid.browser.umd.files);\n }\n }\n } catch (e) {\n this.debugMsg(e);\n }\n } else {\n if (this.fullScrub) {\n message.contents.value = this.replaceText(message.contents.value, TextType.FluidObject);\n }\n }\n }\n }\n\n fixAttachEntries(entries: any[]) {\n entries.forEach((element) => {\n // Tree type\n if (element.value.entries) {\n this.fixAttachEntries(element.value.entries);\n } else {\n // Blob (leaf) type\n try {\n if (typeof element.value.contents === \"string\") {\n let data = JSON.parse(element.value.contents);\n data = this.replaceObject(data);\n element.value.contents = JSON.stringify(data);\n }\n } catch (e) {\n this.debugMsg(e);\n }\n }\n });\n }\n\n /**\n * Fix the content of an attach in place\n * @param contents - contents object to fix\n */\n fixAttachContents(contents: any): any {\n assert(typeof contents === \"object\", 0x08b /* \"Unexpected type on contents for fix of an attach!\" */);\n if (!this.objectMatchesSchema(contents, attachContentsSchema)) {\n this.replaceObject(contents);\n } else {\n if (this.fullScrub) {\n contents.id = this.replaceText(contents.id, TextType.FluidObject);\n contents.type = this.replaceText(contents.type, TextType.FluidObject);\n }\n\n this.fixAttachEntries(contents.snapshot.entries);\n }\n }\n\n /**\n * Fix an attach message at the root level or a ContainerMessageType attach. Attach\n * messages found within an op message should instead have their contents parsed out\n * and sent to fixAttachContents.\n * @param message - The attach message to fix\n * @param withinOp - If the message is from within an op message (as opposed to being\n * an attach message at the root level). Root level attach messages have \"snapshot\"\n * under a \"contents\" key, whereas attach messages from within an op message have it\n * under a \"content\" key\n */\n fixAttach(message: any) {\n // Handle case where contents is stringified json\n if (typeof message.contents === \"string\") {\n try {\n const data = JSON.parse(message.contents);\n this.fixAttachContents(data);\n message.contents = JSON.stringify(data);\n } catch (e) {\n this.debugMsg(e);\n return;\n }\n } else {\n this.fixAttachContents(message.contents);\n }\n }\n\n fixDeltaOp(deltaOp: any) {\n deltaOp.seg = typeof deltaOp.seg === \"string\"\n ? this.replaceText(deltaOp.seg)\n : this.replaceObject(deltaOp.seg, this.mergeTreeExcludedKeys);\n }\n\n /**\n * Fix the contents object for an op message. Does not do extra type handling. Does\n * not handle special container message types like \"attach\", \"component\", and\n * \"chunkedOp\" (these should be handled by the caller)\n * @param contents - The contents object for an op message. If it was a string in the\n * message, it must have been converted to an object first\n */\n fixOpContentsObject(contents: any) {\n // do replacement\n if (!this.objectMatchesSchema(contents, opContentsSchema)) {\n this.replaceAny(contents);\n } else {\n if (this.fullScrub) {\n contents.address = this.replaceText(contents.address, TextType.FluidObject);\n }\n\n const innerContent = contents.contents.content;\n assert(innerContent !== undefined, 0x08c /* \"innerContent for fixing op contents is undefined!\" */);\n if (contents.contents.type === \"attach\") {\n // attach op\n // handle case where inner content is stringified json\n if (typeof contents.contents.content === \"string\") {\n try {\n const data = JSON.parse(contents.contents.content);\n this.fixAttachContents(data);\n contents.contents.content = JSON.stringify(data);\n } catch (e) {\n this.debugMsg(e);\n }\n } else {\n this.fixAttachContents(contents.contents.content);\n }\n } else if (this.validator.validate(innerContent, opContentsMapSchema).valid) {\n // map op\n if (this.fullScrub) {\n innerContent.address = this.replaceText(innerContent.address, TextType.FluidObject);\n innerContent.contents.key = this.replaceText(innerContent.contents.key, TextType.MapKey);\n }\n if (innerContent.contents.value !== undefined) {\n innerContent.contents.value.value = this.replaceAny(innerContent.contents.value.value);\n }\n } else if (this.validator.validate(innerContent, opContentsMergeTreeGroupOpSchema).valid) {\n // merge tree group op\n if (this.fullScrub) {\n innerContent.address = this.replaceText(innerContent.address, TextType.FluidObject);\n }\n innerContent.contents.ops.forEach((deltaOp) => {\n this.fixDeltaOp(deltaOp);\n });\n } else if (this.validator.validate(innerContent, opContentsMergeTreeDeltaOpSchema).valid) {\n // merge tree delta op\n if (this.fullScrub) {\n innerContent.address = this.replaceText(innerContent.address, TextType.FluidObject);\n }\n this.fixDeltaOp(innerContent.contents);\n } else if (this.validator.validate(innerContent, opContentsRegisterCollectionSchema).valid) {\n // register collection op\n if (this.fullScrub) {\n innerContent.address = this.replaceText(innerContent.address, TextType.FluidObject);\n innerContent.contents.key = this.replaceText(innerContent.contents.key, TextType.MapKey);\n }\n if (innerContent.contents.value !== undefined) {\n innerContent.contents.value.value = this.replaceAny(innerContent.contents.value.value);\n }\n } else {\n // message contents don't match any known op format\n this.objectMatchesSchema(contents, false);\n }\n }\n }\n\n fixOp(message: any) {\n // handle case where contents is stringified json\n let msgContents;\n if (typeof message.contents === \"string\") {\n try {\n msgContents = JSON.parse(message.contents);\n } catch (e) {\n this.debugMsg(e);\n return;\n }\n } else {\n msgContents = message.contents;\n }\n\n // handle container message types\n switch (msgContents.type) {\n case \"attach\": {\n // this one is like a regular attach op, except its contents aren't nested as deep\n // run fixAttach directly and return\n this.fixAttach(msgContents);\n break;\n }\n case \"component\": {\n // this one functionally nests its contents one layer deeper\n // bring up the contents object and continue as usual\n this.fixOpContentsObject(msgContents.contents);\n break;\n }\n case \"chunkedOp\": {\n // this is a (regular?) op split into multiple parts due to size, e.g. because it\n // has an attached image, and where the chunkedOp is within the top-level op's contents\n // (as opposed to being at the top-level). The contents of the chunks need to be\n // concatenated to form the complete stringified json object\n // Early return here to skip re-stringify because no changes are made until the last\n // chunk, and the ChunkedOpProcessor will handle everything at that point\n return this.fixChunkedOp(message);\n }\n case \"blobAttach\": {\n // TODO: handle this properly once blob api is used\n this.debugMsg(\"TODO: blobAttach ops are skipped/unhandled\");\n return;\n }\n default: {\n // A regular op\n this.fixOpContentsObject(msgContents);\n }\n }\n\n // re-stringify the json if needed\n if (typeof message.contents === \"string\") {\n try {\n message.contents = JSON.stringify(msgContents);\n } catch (e) {\n this.debugMsg(e);\n return;\n }\n }\n }\n\n /**\n * @param message - The top-level chunkedOp message or a top-level op message\n * with a chunkedOp inside its contents\n */\n fixChunkedOp(message: any) {\n this.chunkProcessor.addMessage(message);\n if (!this.chunkProcessor.hasAllMessages()) {\n return;\n }\n\n const contents = this.chunkProcessor.getConcatenatedContents();\n this.fixOpContentsObject(contents);\n\n this.chunkProcessor.writeSanitizedContents(contents);\n this.chunkProcessor.reset();\n }\n\n sanitize(): ISequencedDocumentMessage[] {\n let seq = 0;\n\n try {\n this.messages.map((message) => {\n seq = message.sequenceNumber;\n // message types from protocol-definitions' protocol.ts\n switch (message.type) {\n case \"join\": {\n this.fixJoin(message);\n break;\n }\n case \"propose\": {\n this.fixPropose(message);\n break;\n }\n case \"attach\": {\n this.fixAttach(message);\n break;\n }\n case \"op\": {\n this.fixOp(message);\n break;\n }\n case \"chunkedOp\": {\n this.fixChunkedOp(message);\n break;\n }\n case \"noop\":\n case \"leave\":\n case \"noClient\":\n case \"summarize\":\n case \"summaryAck\":\n case \"summaryNack\":\n break;\n default:\n this.debugMsg(`Unexpected op type ${message.type}`);\n }\n });\n\n // make sure we don't miss an incomplete chunked op at the end\n assert(!this.chunkProcessor.isPendingProcessing(), 0x08d /* \"After sanitize, pending incomplete ops!\" */);\n } catch (error) {\n this.debugMsg(`Error while processing sequenceNumber ${seq}`);\n throw error;\n }\n\n return this.messages;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sanitizer.js","sourceRoot":"","sources":["../src/sanitizer.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\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 * as Validator from \"jsonschema\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n\tattachContentsSchema,\n\tchunkedOpContentsSchema,\n\tjoinContentsSchema,\n\tjoinDataSchema,\n\topContentsMapSchema,\n\topContentsSchema,\n\topContentsMergeTreeDeltaOpSchema,\n\topContentsMergeTreeGroupOpSchema,\n\topContentsRegisterCollectionSchema,\n\tproposeContentsSchema,\n} from \"./messageSchema\";\n\nenum TextType {\n\tGeneric,\n\tEmail,\n\tName,\n\tFluidObject,\n\tMapKey,\n}\n\n// Workaround to jsonschema package not supporting \"false\" as a schema\n// that matches nothing\nconst falseResult = {\n\tvalid: false,\n\ttoString: () => {\n\t\treturn \"Unmatched format\";\n\t},\n};\n\n/**\n * Class that takes chunkedOp messages and can provide their concatenated\n * contents along with re-write sanitized content in-place back into the\n * messages. Assumes sanitized messages are always less than or equal in\n * size to the original message.\n */\nclass ChunkedOpProcessor {\n\t/**\n\t * Message references so we can replace their contents in-place. These can\n\t * be top-level chunkedOp messages, or top-level op messages with a chunkedOp\n\t * within the contents\n\t */\n\tprivate messages = new Array<any>();\n\t/**\n\t * The messages' parsed contents for processing. Should parallel the\n\t * messages member\n\t */\n\tprivate parsedMessageContents = new Array<any>();\n\tprivate writtenBack = false;\n\t/**\n\t * keep track of the total starting length to make sure we don't somehow end\n\t * up with more content than we started with (meaning we may not be able to\n\t * write it back)\n\t */\n\tprivate concatenatedLength = 0;\n\n\tconstructor(\n\t\treadonly validateSchemaFn: (object: any, schema: any) => boolean,\n\t\treadonly debug: boolean,\n\t) {}\n\n\tdebugMsg(msg: any) {\n\t\tif (this.debug) {\n\t\t\tconsole.error(msg);\n\t\t}\n\t}\n\n\taddMessage(message: any): void {\n\t\tthis.messages.push(message);\n\n\t\tlet parsed;\n\t\ttry {\n\t\t\tparsed = JSON.parse(message.contents);\n\t\t\tif (message.type === \"op\") {\n\t\t\t\t// nested within a regular op\n\t\t\t\t// need to go deeper to get the desired contents\n\t\t\t\tparsed = parsed.contents;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.debugMsg(e);\n\t\t\tthis.debugMsg(message.contents);\n\t\t}\n\t\tthis.validateSchemaFn(parsed, chunkedOpContentsSchema);\n\t\tthis.parsedMessageContents.push(parsed);\n\t}\n\n\thasAllMessages(): boolean {\n\t\tconst lastMsgContents = this.parsedMessageContents[this.parsedMessageContents.length - 1];\n\t\treturn (\n\t\t\tlastMsgContents.chunkId !== undefined &&\n\t\t\tlastMsgContents.chunkId === lastMsgContents.totalChunks\n\t\t);\n\t}\n\n\t/**\n\t * @returns The concatenated contents of all the messages parsed as json\n\t */\n\tgetConcatenatedContents(): any {\n\t\tconst contentsString = this.parsedMessageContents.reduce(\n\t\t\t(previousValue: string, currentValue: any) => {\n\t\t\t\treturn previousValue + (currentValue.contents as string);\n\t\t\t},\n\t\t\t\"\",\n\t\t);\n\n\t\tthis.concatenatedLength = contentsString.length;\n\t\ttry {\n\t\t\treturn JSON.parse(contentsString);\n\t\t} catch (e) {\n\t\t\tthis.debugMsg(contentsString);\n\t\t\tthis.debugMsg(e);\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Write back sanitized contents into the messages. The contents are\n\t * stringified, split up, and written in place to the messages that\n\t * were added earlier. The number of messages is preserved.\n\t * @param contents - Sanitized contents to write back\n\t */\n\twriteSanitizedContents(contents: any): void {\n\t\t// Write back a chunk size equal to the original\n\t\tconst chunkSize = this.parsedMessageContents[0].contents.length;\n\n\t\tlet stringified: string;\n\t\ttry {\n\t\t\tstringified = JSON.stringify(contents);\n\t\t\tassert(\n\t\t\t\tstringified.length <= this.concatenatedLength,\n\t\t\t\t0x089 /* \"Stringified length of chunk contents > total starting length\" */,\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tthis.debugMsg(e);\n\t\t\tthrow e;\n\t\t}\n\n\t\tfor (let i = 0; i < this.messages.length; i++) {\n\t\t\tconst substring = stringified.substring(i * chunkSize, (i + 1) * chunkSize);\n\n\t\t\tconst parsedContents = this.parsedMessageContents[i];\n\t\t\tparsedContents.contents = substring;\n\t\t\tconst message = this.messages[i];\n\n\t\t\tlet stringifiedParsedContents;\n\t\t\ttry {\n\t\t\t\t// for nested chunkedOps, we need to recreate the extra nesting layer\n\t\t\t\t// we removed earlier when adding the message\n\t\t\t\tif (message.type === \"op\") {\n\t\t\t\t\tconst nestingLayer = {\n\t\t\t\t\t\ttype: \"chunkedOp\",\n\t\t\t\t\t\tcontents: parsedContents,\n\t\t\t\t\t};\n\t\t\t\t\tstringifiedParsedContents = JSON.stringify(nestingLayer);\n\t\t\t\t} else {\n\t\t\t\t\tstringifiedParsedContents = JSON.stringify(parsedContents);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tthis.debugMsg(e);\n\t\t\t}\n\n\t\t\tmessage.contents = stringifiedParsedContents;\n\t\t}\n\n\t\tthis.writtenBack = true;\n\t}\n\n\treset(): void {\n\t\tassert(\n\t\t\tthis.writtenBack,\n\t\t\t0x08a /* \"resetting ChunkedOpProcessor that never wrote back its contents\" */,\n\t\t);\n\t\tthis.messages = new Array<any>();\n\t\tthis.parsedMessageContents = new Array<any>();\n\t\tthis.writtenBack = false;\n\t\tthis.concatenatedLength = 0;\n\t}\n\n\tisPendingProcessing(): boolean {\n\t\treturn this.messages.length !== 0;\n\t}\n}\n\nexport class Sanitizer {\n\treadonly validator = new Validator.Validator();\n\t// Represents the keys used to store Fluid object identifiers, snapshot info,\n\t// and other string fields that should not be replaced in contents blobs to\n\t// ensure the messages are still usable\n\treadonly defaultExcludedKeys = new Set<string>();\n\t// Represents the keys used by merge-tree ops their \"seg\" property, where other\n\t// keys represent user information\n\treadonly mergeTreeExcludedKeys = new Set<string>();\n\t// Map of user information to what it was replaced with. Used to ensure the same\n\t// data have the same replacements\n\treadonly replacementMap = new Map<string, string>();\n\n\t/**\n\t * Validate that the provided message matches the provided schema.\n\t * For a full scrub, warn and continue (scrubber should fully sanitize unexpected\n\t * fields for ops), otherwise throw an error because we cannot be sure user\n\t * information is being sufficiently sanitized.\n\t */\n\tobjectMatchesSchema = (object: any, schema: any): boolean => {\n\t\tconst result = schema === false ? falseResult : this.validator.validate(object, schema);\n\t\tif (!result.valid) {\n\t\t\tconst errorMsg = `Bad msg fmt:\\n${result.toString()}\\n${JSON.stringify(\n\t\t\t\tobject,\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t)}`;\n\n\t\t\tif (this.fullScrub || this.noBail) {\n\t\t\t\tthis.debugMsg(errorMsg);\n\t\t\t} else {\n\t\t\t\tthrow new Error(errorMsg);\n\t\t\t}\n\t\t}\n\t\treturn result.valid;\n\t};\n\n\treadonly chunkProcessor = new ChunkedOpProcessor(this.objectMatchesSchema, this.debug);\n\n\tconstructor(\n\t\treadonly messages: ISequencedDocumentMessage[],\n\t\treadonly fullScrub: boolean,\n\t\treadonly noBail: boolean,\n\t\treadonly debug: boolean = false,\n\t) {\n\t\tthis.defaultExcludedKeys.add(\"type\");\n\t\tthis.defaultExcludedKeys.add(\"id\");\n\t\tthis.defaultExcludedKeys.add(\"pkg\");\n\t\tthis.defaultExcludedKeys.add(\"snapshotFormatVersion\");\n\t\tthis.defaultExcludedKeys.add(\"packageVersion\");\n\t\tthis.mergeTreeExcludedKeys.add(\"nodeType\");\n\t}\n\n\tdebugMsg(msg: any) {\n\t\tif (this.debug) {\n\t\t\tconsole.error(msg);\n\t\t}\n\t}\n\n\tisFluidObjectKey(key: string): boolean {\n\t\treturn key === \"type\" || key === \"id\";\n\t}\n\n\tgetRandomText(len: number): string {\n\t\tlet str = \"\";\n\t\twhile (str.length < len) {\n\t\t\tstr = str + Math.random().toString(36).substring(2);\n\t\t}\n\t\treturn str.substr(0, len);\n\t}\n\n\treadonly wordTokenRegex = /\\S+/g;\n\n\treadonly replaceRandomTextFn = (match: string): string => {\n\t\tif (this.replacementMap.has(match)) {\n\t\t\treturn this.replacementMap.get(match)!;\n\t\t}\n\n\t\tconst replacement = this.getRandomText(match.length);\n\t\tthis.replacementMap.set(match, replacement);\n\t\treturn replacement;\n\t};\n\n\t/**\n\t * Replace text with garbage. FluidObject types are not replaced when not under\n\t * full scrub mode. All other text is replaced consistently.\n\t */\n\treplaceText(input?: string, type: TextType = TextType.Generic): string | undefined {\n\t\tif (input === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (type === TextType.FluidObject) {\n\t\t\tif (this.replacementMap.has(input)) {\n\t\t\t\treturn this.replacementMap.get(input)!;\n\t\t\t}\n\n\t\t\tconst replacement = this.fullScrub ? this.getRandomText(input.length) : input;\n\n\t\t\tthis.replacementMap.set(input, replacement);\n\t\t\treturn replacement;\n\t\t}\n\n\t\treturn input.replace(this.wordTokenRegex, this.replaceRandomTextFn);\n\t}\n\n\treplaceArray(input: any[]): any[] {\n\t\tfor (let i = 0; i < input.length; i++) {\n\t\t\tconst value = input[i];\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tinput[i] = this.replaceText(value);\n\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\tinput[i] = this.replaceArray(value);\n\t\t\t} else if (typeof value === \"object\") {\n\t\t\t\tinput[i] = this.replaceObject(value);\n\t\t\t}\n\t\t}\n\t\treturn input;\n\t}\n\n\t/**\n\t * (sort of) recurses down the values of a JSON object to sanitize all its strings\n\t * (only checks strings, arrays, and objects)\n\t * @param input - The object to sanitize\n\t * @param excludedKeys - object keys for which to skip replacement when not in fullScrub\n\t */\n\treplaceObject(\n\t\tinput: object | null,\n\t\texcludedKeys: Set<string> = this.defaultExcludedKeys,\n\t): object | null {\n\t\t// File might contain actual nulls\n\t\tif (input === null || input === undefined) {\n\t\t\treturn input;\n\t\t}\n\n\t\tconst keys = Object.keys(input);\n\t\tkeys.forEach((key) => {\n\t\t\tif (this.fullScrub || !excludedKeys.has(key)) {\n\t\t\t\tconst value = input[key];\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\tinput[key] = this.replaceText(\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tthis.isFluidObjectKey(key) ? TextType.FluidObject : TextType.Generic,\n\t\t\t\t\t);\n\t\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\t\tinput[key] = this.replaceArray(value);\n\t\t\t\t} else if (typeof value === \"object\") {\n\t\t\t\t\tinput[key] = this.replaceObject(value, excludedKeys);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn input;\n\t}\n\n\t/**\n\t * Replacement on an unknown type or a parsed root level object\n\t * without a key\n\t * @param input - The object to sanitize\n\t * @param excludedKeys - object keys for which to skip replacement when not in fullScrub\n\t */\n\treplaceAny(input: any, excludedKeys: Set<string> = this.defaultExcludedKeys): any {\n\t\tif (input === null || input === undefined) {\n\t\t\treturn input;\n\t\t}\n\n\t\tif (typeof input === \"string\") {\n\t\t\treturn this.replaceText(input);\n\t\t} else if (Array.isArray(input)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\t\treturn this.replaceArray(input);\n\t\t} else if (typeof input === \"object\") {\n\t\t\treturn this.replaceObject(input, excludedKeys);\n\t\t}\n\n\t\t// Don't run replacement on any other types\n\t\treturn input;\n\t}\n\n\tfixJoin(message: any) {\n\t\tif (!this.objectMatchesSchema(message.contents, joinContentsSchema)) {\n\t\t\tmessage.contents = this.replaceAny(message.contents);\n\t\t}\n\n\t\ttry {\n\t\t\tlet data = JSON.parse(message.data);\n\t\t\tif (!this.objectMatchesSchema(data, joinDataSchema)) {\n\t\t\t\tdata = this.replaceAny(data);\n\t\t\t} else {\n\t\t\t\tconst user = data.detail.user;\n\t\t\t\tuser.id = this.replaceText(user.id, TextType.Email);\n\t\t\t\tuser.email = this.replaceText(user.email, TextType.Email);\n\t\t\t\tuser.name = this.replaceText(user.name, TextType.Name);\n\t\t\t}\n\n\t\t\tmessage.data = JSON.stringify(data);\n\t\t} catch (e) {\n\t\t\tthis.debugMsg(e);\n\t\t}\n\t}\n\n\tfixPropose(message: any) {\n\t\tif (!this.objectMatchesSchema(message.contents, proposeContentsSchema)) {\n\t\t\tmessage.contents = this.replaceAny(message.contents);\n\t\t} else {\n\t\t\tif (typeof message.contents === \"string\") {\n\t\t\t\ttry {\n\t\t\t\t\tconst data = JSON.parse(message.contents);\n\t\t\t\t\tif (this.fullScrub) {\n\t\t\t\t\t\tconst pkg = data.value?.package;\n\t\t\t\t\t\tif (pkg?.name) {\n\t\t\t\t\t\t\tpkg.name = this.replaceText(pkg.name, TextType.FluidObject);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (Array.isArray(pkg?.fluid?.browser?.umd?.files)) {\n\t\t\t\t\t\t\tpkg.fluid.browser.umd.files = this.replaceArray(\n\t\t\t\t\t\t\t\tpkg.fluid.browser.umd.files,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthis.debugMsg(e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.fullScrub) {\n\t\t\t\t\tmessage.contents.value = this.replaceText(\n\t\t\t\t\t\tmessage.contents.value,\n\t\t\t\t\t\tTextType.FluidObject,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfixAttachEntries(entries: any[]) {\n\t\tentries.forEach((element) => {\n\t\t\t// Tree type\n\t\t\tif (element.value.entries) {\n\t\t\t\tthis.fixAttachEntries(element.value.entries);\n\t\t\t} else {\n\t\t\t\t// Blob (leaf) type\n\t\t\t\ttry {\n\t\t\t\t\tif (typeof element.value.contents === \"string\") {\n\t\t\t\t\t\tlet data = JSON.parse(element.value.contents);\n\t\t\t\t\t\tdata = this.replaceObject(data);\n\t\t\t\t\t\telement.value.contents = JSON.stringify(data);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthis.debugMsg(e);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Fix the content of an attach in place\n\t * @param contents - contents object to fix\n\t */\n\tfixAttachContents(contents: any): any {\n\t\tassert(\n\t\t\ttypeof contents === \"object\",\n\t\t\t0x08b /* \"Unexpected type on contents for fix of an attach!\" */,\n\t\t);\n\t\tif (!this.objectMatchesSchema(contents, attachContentsSchema)) {\n\t\t\tthis.replaceObject(contents);\n\t\t} else {\n\t\t\tif (this.fullScrub) {\n\t\t\t\tcontents.id = this.replaceText(contents.id, TextType.FluidObject);\n\t\t\t\tcontents.type = this.replaceText(contents.type, TextType.FluidObject);\n\t\t\t}\n\n\t\t\tthis.fixAttachEntries(contents.snapshot.entries);\n\t\t}\n\t}\n\n\t/**\n\t * Fix an attach message at the root level or a ContainerMessageType attach. Attach\n\t * messages found within an op message should instead have their contents parsed out\n\t * and sent to fixAttachContents.\n\t * @param message - The attach message to fix\n\t * @param withinOp - If the message is from within an op message (as opposed to being\n\t * an attach message at the root level). Root level attach messages have \"snapshot\"\n\t * under a \"contents\" key, whereas attach messages from within an op message have it\n\t * under a \"content\" key\n\t */\n\tfixAttach(message: any) {\n\t\t// Handle case where contents is stringified json\n\t\tif (typeof message.contents === \"string\") {\n\t\t\ttry {\n\t\t\t\tconst data = JSON.parse(message.contents);\n\t\t\t\tthis.fixAttachContents(data);\n\t\t\t\tmessage.contents = JSON.stringify(data);\n\t\t\t} catch (e) {\n\t\t\t\tthis.debugMsg(e);\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.fixAttachContents(message.contents);\n\t\t}\n\t}\n\n\tfixDeltaOp(deltaOp: any) {\n\t\tdeltaOp.seg =\n\t\t\ttypeof deltaOp.seg === \"string\"\n\t\t\t\t? this.replaceText(deltaOp.seg)\n\t\t\t\t: this.replaceObject(deltaOp.seg, this.mergeTreeExcludedKeys);\n\t}\n\n\t/**\n\t * Fix the contents object for an op message. Does not do extra type handling. Does\n\t * not handle special container message types like \"attach\", \"component\", and\n\t * \"chunkedOp\" (these should be handled by the caller)\n\t * @param contents - The contents object for an op message. If it was a string in the\n\t * message, it must have been converted to an object first\n\t */\n\tfixOpContentsObject(contents: any) {\n\t\t// do replacement\n\t\tif (!this.objectMatchesSchema(contents, opContentsSchema)) {\n\t\t\tthis.replaceAny(contents);\n\t\t} else {\n\t\t\tif (this.fullScrub) {\n\t\t\t\tcontents.address = this.replaceText(contents.address, TextType.FluidObject);\n\t\t\t}\n\n\t\t\tconst innerContent = contents.contents.content;\n\t\t\tassert(\n\t\t\t\tinnerContent !== undefined,\n\t\t\t\t0x08c /* \"innerContent for fixing op contents is undefined!\" */,\n\t\t\t);\n\t\t\tif (contents.contents.type === \"attach\") {\n\t\t\t\t// attach op\n\t\t\t\t// handle case where inner content is stringified json\n\t\t\t\tif (typeof contents.contents.content === \"string\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst data = JSON.parse(contents.contents.content);\n\t\t\t\t\t\tthis.fixAttachContents(data);\n\t\t\t\t\t\tcontents.contents.content = JSON.stringify(data);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tthis.debugMsg(e);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.fixAttachContents(contents.contents.content);\n\t\t\t\t}\n\t\t\t} else if (this.validator.validate(innerContent, opContentsMapSchema).valid) {\n\t\t\t\t// map op\n\t\t\t\tif (this.fullScrub) {\n\t\t\t\t\tinnerContent.address = this.replaceText(\n\t\t\t\t\t\tinnerContent.address,\n\t\t\t\t\t\tTextType.FluidObject,\n\t\t\t\t\t);\n\t\t\t\t\tinnerContent.contents.key = this.replaceText(\n\t\t\t\t\t\tinnerContent.contents.key,\n\t\t\t\t\t\tTextType.MapKey,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (innerContent.contents.value !== undefined) {\n\t\t\t\t\tinnerContent.contents.value.value = this.replaceAny(\n\t\t\t\t\t\tinnerContent.contents.value.value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tthis.validator.validate(innerContent, opContentsMergeTreeGroupOpSchema).valid\n\t\t\t) {\n\t\t\t\t// merge tree group op\n\t\t\t\tif (this.fullScrub) {\n\t\t\t\t\tinnerContent.address = this.replaceText(\n\t\t\t\t\t\tinnerContent.address,\n\t\t\t\t\t\tTextType.FluidObject,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tinnerContent.contents.ops.forEach((deltaOp) => {\n\t\t\t\t\tthis.fixDeltaOp(deltaOp);\n\t\t\t\t});\n\t\t\t} else if (\n\t\t\t\tthis.validator.validate(innerContent, opContentsMergeTreeDeltaOpSchema).valid\n\t\t\t) {\n\t\t\t\t// merge tree delta op\n\t\t\t\tif (this.fullScrub) {\n\t\t\t\t\tinnerContent.address = this.replaceText(\n\t\t\t\t\t\tinnerContent.address,\n\t\t\t\t\t\tTextType.FluidObject,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.fixDeltaOp(innerContent.contents);\n\t\t\t} else if (\n\t\t\t\tthis.validator.validate(innerContent, opContentsRegisterCollectionSchema).valid\n\t\t\t) {\n\t\t\t\t// register collection op\n\t\t\t\tif (this.fullScrub) {\n\t\t\t\t\tinnerContent.address = this.replaceText(\n\t\t\t\t\t\tinnerContent.address,\n\t\t\t\t\t\tTextType.FluidObject,\n\t\t\t\t\t);\n\t\t\t\t\tinnerContent.contents.key = this.replaceText(\n\t\t\t\t\t\tinnerContent.contents.key,\n\t\t\t\t\t\tTextType.MapKey,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (innerContent.contents.value !== undefined) {\n\t\t\t\t\tinnerContent.contents.value.value = this.replaceAny(\n\t\t\t\t\t\tinnerContent.contents.value.value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// message contents don't match any known op format\n\t\t\t\tthis.objectMatchesSchema(contents, false);\n\t\t\t}\n\t\t}\n\t}\n\n\tfixOp(message: any) {\n\t\t// handle case where contents is stringified json\n\t\tlet msgContents;\n\t\tif (typeof message.contents === \"string\") {\n\t\t\ttry {\n\t\t\t\tmsgContents = JSON.parse(message.contents);\n\t\t\t} catch (e) {\n\t\t\t\tthis.debugMsg(e);\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\tmsgContents = message.contents;\n\t\t}\n\n\t\t// handle container message types\n\t\tswitch (msgContents.type) {\n\t\t\tcase \"attach\": {\n\t\t\t\t// this one is like a regular attach op, except its contents aren't nested as deep\n\t\t\t\t// run fixAttach directly and return\n\t\t\t\tthis.fixAttach(msgContents);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"component\": {\n\t\t\t\t// this one functionally nests its contents one layer deeper\n\t\t\t\t// bring up the contents object and continue as usual\n\t\t\t\tthis.fixOpContentsObject(msgContents.contents);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"chunkedOp\": {\n\t\t\t\t// this is a (regular?) op split into multiple parts due to size, e.g. because it\n\t\t\t\t// has an attached image, and where the chunkedOp is within the top-level op's contents\n\t\t\t\t// (as opposed to being at the top-level). The contents of the chunks need to be\n\t\t\t\t// concatenated to form the complete stringified json object\n\t\t\t\t// Early return here to skip re-stringify because no changes are made until the last\n\t\t\t\t// chunk, and the ChunkedOpProcessor will handle everything at that point\n\t\t\t\treturn this.fixChunkedOp(message);\n\t\t\t}\n\t\t\tcase \"blobAttach\": {\n\t\t\t\t// TODO: handle this properly once blob api is used\n\t\t\t\tthis.debugMsg(\"TODO: blobAttach ops are skipped/unhandled\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\t// A regular op\n\t\t\t\tthis.fixOpContentsObject(msgContents);\n\t\t\t}\n\t\t}\n\n\t\t// re-stringify the json if needed\n\t\tif (typeof message.contents === \"string\") {\n\t\t\ttry {\n\t\t\t\tmessage.contents = JSON.stringify(msgContents);\n\t\t\t} catch (e) {\n\t\t\t\tthis.debugMsg(e);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param message - The top-level chunkedOp message or a top-level op message\n\t * with a chunkedOp inside its contents\n\t */\n\tfixChunkedOp(message: any) {\n\t\tthis.chunkProcessor.addMessage(message);\n\t\tif (!this.chunkProcessor.hasAllMessages()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst contents = this.chunkProcessor.getConcatenatedContents();\n\t\tthis.fixOpContentsObject(contents);\n\n\t\tthis.chunkProcessor.writeSanitizedContents(contents);\n\t\tthis.chunkProcessor.reset();\n\t}\n\n\tsanitize(): ISequencedDocumentMessage[] {\n\t\tlet seq = 0;\n\n\t\ttry {\n\t\t\tthis.messages.map((message) => {\n\t\t\t\tseq = message.sequenceNumber;\n\t\t\t\t// message types from protocol-definitions' protocol.ts\n\t\t\t\tswitch (message.type) {\n\t\t\t\t\tcase \"join\": {\n\t\t\t\t\t\tthis.fixJoin(message);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"propose\": {\n\t\t\t\t\t\tthis.fixPropose(message);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"attach\": {\n\t\t\t\t\t\tthis.fixAttach(message);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"op\": {\n\t\t\t\t\t\tthis.fixOp(message);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"chunkedOp\": {\n\t\t\t\t\t\tthis.fixChunkedOp(message);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"noop\":\n\t\t\t\t\tcase \"leave\":\n\t\t\t\t\tcase \"noClient\":\n\t\t\t\t\tcase \"summarize\":\n\t\t\t\t\tcase \"summaryAck\":\n\t\t\t\t\tcase \"summaryNack\":\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthis.debugMsg(`Unexpected op type ${message.type}`);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// make sure we don't miss an incomplete chunked op at the end\n\t\t\tassert(\n\t\t\t\t!this.chunkProcessor.isPendingProcessing(),\n\t\t\t\t0x08d /* \"After sanitize, pending incomplete ops!\" */,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthis.debugMsg(`Error while processing sequenceNumber ${seq}`);\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn this.messages;\n\t}\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/debugger",
|
|
3
|
-
"version": "2.0.0-dev.
|
|
3
|
+
"version": "2.0.0-dev.3.1.0.125672",
|
|
4
4
|
"description": "Fluid Debugger - a tool to play through history of a file",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"eslint": "eslint --format stylish src",
|
|
27
27
|
"eslint:fix": "eslint --format stylish src --fix --fix-type problem,suggestion,layout",
|
|
28
28
|
"format": "npm run prettier:fix",
|
|
29
|
-
"lint": "npm run eslint",
|
|
30
|
-
"lint:fix": "npm run eslint:fix",
|
|
29
|
+
"lint": "npm run prettier && npm run eslint",
|
|
30
|
+
"lint:fix": "npm run prettier:fix && npm run eslint:fix",
|
|
31
31
|
"prettier": "prettier --check . --ignore-path ../../../.prettierignore",
|
|
32
32
|
"prettier:fix": "prettier --write . --ignore-path ../../../.prettierignore",
|
|
33
33
|
"tsc": "tsc",
|
|
@@ -36,22 +36,22 @@
|
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@fluidframework/common-utils": "^1.0.0",
|
|
39
|
-
"@fluidframework/driver-definitions": ">=2.0.0-dev.
|
|
40
|
-
"@fluidframework/driver-utils": ">=2.0.0-dev.
|
|
39
|
+
"@fluidframework/driver-definitions": ">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0",
|
|
40
|
+
"@fluidframework/driver-utils": ">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0",
|
|
41
41
|
"@fluidframework/protocol-definitions": "^1.1.0",
|
|
42
|
-
"@fluidframework/replay-driver": ">=2.0.0-dev.
|
|
42
|
+
"@fluidframework/replay-driver": ">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0",
|
|
43
43
|
"jsonschema": "^1.2.6"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@fluid-tools/build-cli": "^0.
|
|
46
|
+
"@fluid-tools/build-cli": "^0.8.0",
|
|
47
47
|
"@fluidframework/build-common": "^1.1.0",
|
|
48
|
-
"@fluidframework/build-tools": "^0.
|
|
49
|
-
"@fluidframework/debugger-previous": "npm:@fluidframework/debugger@2.0.0-internal.
|
|
50
|
-
"@fluidframework/eslint-config-fluid": "^
|
|
48
|
+
"@fluidframework/build-tools": "^0.8.0",
|
|
49
|
+
"@fluidframework/debugger-previous": "npm:@fluidframework/debugger@2.0.0-internal.3.0.0",
|
|
50
|
+
"@fluidframework/eslint-config-fluid": "^2.0.0",
|
|
51
51
|
"@microsoft/api-extractor": "^7.22.2",
|
|
52
52
|
"@rushstack/eslint-config": "^2.5.1",
|
|
53
53
|
"@types/mocha": "^9.1.1",
|
|
54
|
-
"@types/node": "^14.18.
|
|
54
|
+
"@types/node": "^14.18.36",
|
|
55
55
|
"concurrently": "^6.2.0",
|
|
56
56
|
"copyfiles": "^2.4.1",
|
|
57
57
|
"eslint": "~8.6.0",
|
|
@@ -61,9 +61,10 @@
|
|
|
61
61
|
"typescript": "~4.5.5"
|
|
62
62
|
},
|
|
63
63
|
"typeValidation": {
|
|
64
|
-
"version": "2.0.0-internal.
|
|
65
|
-
"
|
|
66
|
-
"
|
|
64
|
+
"version": "2.0.0-internal.3.1.0",
|
|
65
|
+
"previousVersionStyle": "~previousMinor",
|
|
66
|
+
"baselineRange": ">=2.0.0-internal.3.0.0 <2.0.0-internal.3.1.0",
|
|
67
|
+
"baselineVersion": "2.0.0-internal.3.0.0",
|
|
67
68
|
"broken": {}
|
|
68
69
|
}
|
|
69
70
|
}
|