{
  "version": 3,
  "sources": ["../../src/document/loader/PartialDocumentParser.ts", "../../src/document/serialization/index.ts", "../../src/document/loader/DocumentLoader.ts", "../../src/document/crdt/sync/CrdtDocumentLoader.ts"],
  "sourcesContent": ["import {\n\tBytesDocumentParser,\n\tDocumentParser,\n\ttype DocumentParserInterface,\n\ttype SnapshotNode,\n} from \"@framerjs/document-snapshotter\"\nimport type { AnyComponentLoader } from \"@framerjs/framer-runtime\"\nimport { getLogger } from \"@framerjs/shared\"\nimport { repairPage } from \"document/models/CanvasTree/TreeRepair.ts\"\nimport type { TreeServices } from \"document/models/CanvasTree/TreeServices.ts\"\nimport { canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\nimport { isDesignPageNode, isWebPageNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { canRenderPageTypeBeforeDocumentHasFullyLoaded, findFirstScopes } from \"../firstScopeFinder.ts\"\nimport type { CanvasNode, CanvasTree } from \"../models/CanvasTree/index.ts\"\nimport * as partialDocument from \"../partialDocument.ts\"\nimport type { PartialParser } from \"./PartialParser.ts\"\n\nconst log = getLogger(\"DocumentLoader\")\nconst verifyLog = getLogger(\"remote:verify\")\n\ninterface Settings {\n\tactiveNodeId?: string | null\n\ttreeServices?: TreeServices\n}\n\nexport class PartialDocumentParser<P extends DocumentParserInterface> implements PartialParser {\n\tcanvasTreeVersion = 0\n\tchunkingHints: ReadonlySet<string>\n\n\t/**\n\t * Static factory method to create the appropriate parser for the data type.\n\t */\n\tstatic async createPartialParser(\n\t\tdata: string | Uint8Array,\n\t\tcomponentLoader: AnyComponentLoader,\n\t\tsettings: Settings,\n\t): Promise<PartialParser> {\n\t\tif (typeof data === \"string\") {\n\t\t\t// Text-based parsing\n\t\t\tconst parser = new DocumentParser(data)\n\t\t\treturn new PartialDocumentParser(componentLoader, parser, settings)\n\t\t} else {\n\t\t\t// Convert ReadableStream to Uint8Array and pass directly to streaming parser\n\t\t\tconst parser = new BytesDocumentParser(data)\n\t\t\treturn new PartialDocumentParser(componentLoader, parser, settings)\n\t\t}\n\t}\n\n\tconstructor(\n\t\tprivate readonly componentLoader: AnyComponentLoader,\n\t\tpublic readonly parser: P,\n\t\treadonly settings: Settings,\n\t) {\n\t\tthis.canvasTreeVersion = this.parser.version\n\t\tthis.chunkingHints = this.parser.getChunkingHints()\n\t}\n\n\treadFirstPage(): CanvasTree {\n\t\tlet foundScopesToLoad = false\n\t\tconst scopeIds: string[] = []\n\n\t\tif (this.settings.activeNodeId) {\n\t\t\t// `getPagesContainingId` should be used sparingly because it can do an expensive string search\n\t\t\tscopeIds.push(...this.parser.getPagesContainingId(this.settings.activeNodeId))\n\t\t\tfoundScopesToLoad = scopeIds.some(id =>\n\t\t\t\tcanRenderPageTypeBeforeDocumentHasFullyLoaded(this.parser.getShallowPage(id)),\n\t\t\t)\n\t\t}\n\n\t\tif (!foundScopesToLoad) {\n\t\t\tconst shallowPages = this.parser.getShallowPages()\n\t\t\tconst { maybeFirstPage } = findFirstScopes(shallowPages, this.parser.getHomePageNodeID())\n\t\t\tscopeIds.push(maybeFirstPage.id)\n\n\t\t\t// When there is only a single web page, and at least one design page, load the design\n\t\t\t// page as well. This allows the engine to synchronously choose to show the design page\n\t\t\t// if the web page is empty without pausing to load more scopes. It should never impact\n\t\t\t// performance in large projects with more than 1 web page.\n\t\t\tlet webPageCount = 0\n\t\t\tlet firstDesignPage: string | undefined\n\t\t\tfor (const page of shallowPages) {\n\t\t\t\tif (isWebPageNode(page, true)) webPageCount++\n\t\t\t\tif (webPageCount > 1) break\n\t\t\t\tif (isDesignPageNode(page, true)) firstDesignPage ??= page.id\n\t\t\t}\n\t\t\tif (webPageCount === 1 && firstDesignPage && firstDesignPage !== maybeFirstPage.id) {\n\t\t\t\tscopeIds.push(firstDesignPage)\n\t\t\t}\n\t\t}\n\n\t\tlog.debug(\"loadPartialDocument():\", scopeIds)\n\n\t\treturn partialDocument.loadPartialDocument(this.parser, this.componentLoader, scopeIds, this.settings.treeServices)\n\t}\n\n\tgetScopesToLoad(): Set<string> {\n\t\treturn this.parser.getPagesToLoad()\n\t}\n\n\tgetParsedPageById(id: string): SnapshotNode | null {\n\t\treturn this.parser.getParsedPageById(id)\n\t}\n\n\tbuildPage(data: SnapshotNode | null | undefined): CanvasNode | undefined {\n\t\tif (!data) return undefined\n\t\tconst errors: string[] = []\n\t\tconst warnings: string[] | undefined = verifyLog.isLoggingTraceMessages() ? [] : undefined\n\n\t\tconst page = canvasNodeFromValue(data, this.parser.root.id, { extraChecksAndFixes: true, errors, warnings })\n\t\tif (page) {\n\t\t\trepairPage(page, errors)\n\t\t}\n\t\tif (errors.length > 0) {\n\t\t\tverifyLog.warn(\"errors loading server tree: \" + errors.join(\"\\n\"))\n\t\t}\n\t\tif (warnings && warnings.length > 0) {\n\t\t\tverifyLog.trace(\"warnings loading server tree: \" + warnings.join(\"\\n\"))\n\t\t}\n\t\tif (!page) return undefined\n\t\treturn page\n\t}\n}\n", "import type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { getLogger } from \"@framerjs/shared\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { safeLoadDocument } from \"document/models/CanvasTree/TreeRepair.ts\"\nimport { environment } from \"environment/index.ts\"\nimport type { CanvasTree } from \"../models/CanvasTree/index.ts\"\n\nconst log = getLogger(\"app\")\n\nexport function serializeDocument(engine: VekterEngine): Record<string, unknown> | null {\n\t// Never serialize a tree that doesn't actually reflect user data\n\tif (!engine.treeReflectsDocument) {\n\t\treturn null\n\t}\n\treturn serializeTree(engine.tree)\n}\n\nexport function serializeTree(tree: CanvasTree) {\n\treturn tree.toJS()\n}\n\n// a function that translates the document into a simple json representation, keeping only the most important properties\nexport function snapshotDocument(engine: VekterEngine): any {\n\tfunction remap(node: any): any {\n\t\tconst { __class, width, height, top, bottom, left, right } = node\n\t\tlet { children } = node\n\t\tif (!children) {\n\t\t\tif (node.styledText) {\n\t\t\t\treturn {\n\t\t\t\t\t__class,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\ttop,\n\t\t\t\t\tbottom,\n\t\t\t\t\tleft,\n\t\t\t\t\tright,\n\t\t\t\t\ttext: node.styledText.blocks.map((b: any) => b.text),\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { __class, width, height, top, bottom, left, right }\n\t\t}\n\n\t\tchildren = children.map(remap)\n\t\treturn { __class, width, height, top, bottom, left, right, children }\n\t}\n\treturn remap(engine.tree.toJS().root)\n}\n\nexport function loadDocument(url: URL | string, componentLoader: ComponentLoader): CanvasTree {\n\tlet documentJSON: object | undefined = undefined\n\tconst xhr = new XMLHttpRequest()\n\txhr.open(\"GET\", url.toString(), false)\n\ttry {\n\t\txhr.send()\n\t\tdocumentJSON = JSON.parse(xhr.responseText)\n\t} catch (exception) {\n\t\tlog.error(`Retrieving document \u201C${url}\u201D failed. (${exception})`)\n\t}\n\treturn loadDocumentJSON(documentJSON, componentLoader)\n}\n\nfunction reportErrors(errors: string[]) {\n\tif (environment.isTest) return\n\terrors.forEach(error => {\n\t\tlog.warn(\"[repaired]\", error)\n\t})\n}\n\n/**\n * Safe loads a document from JSON\n * @param doc\n */\nexport function loadDocumentJSON(doc: unknown, componentLoader: ComponentLoader): CanvasTree {\n\tconst errors: string[] = []\n\ttry {\n\t\tconst tree = safeLoadDocument(doc, componentLoader, errors)\n\t\treportErrors(errors)\n\t\treturn tree\n\t} catch (e) {\n\t\treportErrors(errors)\n\t\tlog.warn(\"tree failed to verify:\", e)\n\t\tthrow e\n\t}\n}\n", "/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */\nimport { type SnapshotNode, isParsableDocument } from \"@framerjs/document-snapshotter\"\nimport type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { ResolvablePromise, assert, getLogger, schedulerYield } from \"@framerjs/shared\"\nimport { experiments } from \"app/experiments.ts\"\nimport { isCrdt, shouldNeverLoadRest } from \"document/crdt/isCrdt.ts\"\nimport type { LocalCache } from \"document/crdt/sync/LocalCache.ts\"\nimport { PartialDocumentParser } from \"document/loader/PartialDocumentParser.ts\"\nimport type { NodeChange } from \"document/models/CanvasTree/TreeDiff.ts\"\nimport type {\n\tLoader,\n\tPrioritizeLoadingOptions,\n\tPrioritizeLoadingOptionsWithCallback,\n\tTreeServices,\n} from \"document/models/CanvasTree/TreeServices.ts\"\nimport type { CanvasNode, CanvasTree } from \"document/models/CanvasTree/index.ts\"\nimport { treeModeForTree } from \"document/stores/TreeMode.ts\"\nimport type { InitData } from \"document/stores/TreeStore.ts\"\nimport { EventEmitter } from \"eventemitter3\"\nimport { markLoadingPerf, setLoadingInfo } from \"utils/performanceTracker.ts\"\nimport { isNumber } from \"utils/typeChecks.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { loadDocumentJSON } from \"../serialization/index.ts\"\nimport type { PartialParser } from \"./PartialParser.ts\"\nimport { TaskScheduler } from \"./TaskScheduler.ts\"\n\nconst log = getLogger(\"DocumentLoader\")\n\nexport const MAX_RETRIES = 10\nexport const RETRY_BACKOFF_MS = 1000\n\nexport function humanSize(size: number) {\n\tif (size < 1024 * 0.75) return `${Math.round(size)}b`\n\tif (size < 1024 * 1024 * 0.75) return `${(size / 1024).toFixed(2)}kb`\n\treturn `${(size / 1024 / 1024).toFixed(2)}Mb`\n}\n\nexport function humanTime(time: number) {\n\tif (time < 200) return `${time.toFixed(1)}ms`\n\tif (time < 20 * 1000) return `${(time / 1000).toFixed(3)}s`\n\treturn `${Math.round(time / 1000)}s`\n}\n\nexport interface DocumentLoaderSettings {\n\tpartialParsing: boolean\n\tloadInBackground?: boolean\n\tinitData?: InitData\n\tactiveNodeId?: string | null\n\ttreeServices?: TreeServices\n\tloadedData?: string | Uint8Array\n\trefreshAccessToken?: (initData: RequestInit) => Promise<RequestInit>\n\n\t/** If provided, all events except error events will be emitted from the body passed into this\n\t * async function. RemoteDocument uses this to handle events synchronously but inside of\n\t * `processBetweenFrames`. */\n\tasyncEventWrapper?: (body: () => void) => Promise<void>\n\n\t/** Can be used to provide a custom requestIdleCallback implementation. Otherwise the scheduler\n\t * will use the native requestIdleCallback, but that one doesn't know about user interactions,\n\t * only about how long it takes to render a frame. */\n\trequestIdleCallback?: (body: () => void) => void\n\n\t/** Optional local cache for persisting CRDT snapshot and incremental rows to IndexedDB. */\n\tlocalCache?: LocalCache\n}\n\ntype Unsubscribe = () => void\n\ninterface DocumentLoaderEvents {\n\t/** When any error was encountered while loading. The loading task will be\n\t * in an error state and cannot be somehow resumed. */\n\terror: (error: Error) => void\n\t/** When the first data from the document is available to verify the tree version. */\n\tloadedDocumentVersion: (version: number) => void\n\t/** When the binary format version has been read from the CRDT buffer header. */\n\tloadedFormatVersion: (version: number) => void\n\t/** When the first scopes of the document have been loaded. Is always\n\t * emitted, event if not partial parsing. */\n\tloadedFirstData: (tree: CanvasTree) => void\n\t/** When a scope has been parsed and loaded ready to be inserted into\n\t * the tree. Will only be emitted if partial parsing is enabled. */\n\tloadedScope: (scope: CanvasNode) => void\n\t/** When the whole tree has been loaded. Is always emitted, even if\n\t * not partial parsing. */\n\tloadedAllData: () => void\n}\n\nexport class DocumentLoader extends EventEmitter<DocumentLoaderEvents> implements Loader {\n\tpublic readonly scheduler: TaskScheduler\n\n\tactivelyLoadingScope = false\n\n\tprivate retryCount = 0\n\n\t/** contains scope ids that have not yet started loading */\n\tprotected scopesToLoad = new Set<string>()\n\t/** contains scope ids that have been explicitly requested to load */\n\tprotected prioritizedScopeIds = new Set<string>()\n\tprotected currentLoadingScope: LoadingScopeInterface | undefined = undefined\n\n\tprivate partialParser: PartialParser | undefined\n\n\t// stats\n\tcanvasTreeVersion = 0\n\tdocumentSize = 0\n\tloadedFirstScope = false\n\tprotected loadingDuration = 0\n\tprotected parsingDuration = 0\n\n\tconstructor(\n\t\tprotected readonly componentLoader: ComponentLoader,\n\t\treadonly treeVersion: number,\n\t\treadonly documentURL: string,\n\t\treadonly settings: DocumentLoaderSettings,\n\t) {\n\t\tsuper()\n\t\tthis.scheduler = new TaskScheduler(settings.requestIdleCallback)\n\t\tlog.debug(\"new:\", this.treeVersion, this.documentURL)\n\t}\n\n\tprivate debugPaused = false\n\tprivate loadingScopesPaused = false\n\tprivate loadAllDataPriority = 0\n\n\t/** Sets the scheduler to fast (foreground) or slow (background) mode. Depending on the current state. */\n\tprotected updatePauseResumeState = () => {\n\t\t// If we didn't load the first scope yet, always run in fast mode.\n\t\tif (!this.loadedFirstScope) {\n\t\t\tthis.scheduler.fast()\n\t\t\tthis.scheduler.resume()\n\t\t\treturn\n\t\t}\n\n\t\t// If we are loading all scopes, or there are prioritized scopes, run in fast mode.\n\t\tconst priority = this.loadAllDataPriority > 0 || this.prioritizedScopeIds.size > 0\n\t\tconst paused = this.loadingScopesPaused || this.debugPaused\n\n\t\tif (priority) {\n\t\t\tthis.scheduler.fast()\n\t\t} else {\n\t\t\tthis.scheduler.slow()\n\t\t}\n\n\t\tif (priority || !paused || this.scopesToLoad.size <= 0) {\n\t\t\tthis.scheduler.resume()\n\t\t} else {\n\t\t\tthis.scheduler.pause()\n\t\t}\n\t}\n\n\tpauseLoadingScopes() {\n\t\tif (this.loadingScopesPaused) return\n\t\tthis.loadingScopesPaused = true\n\t\tlog.debug(\"pauseLoadingScopes\")\n\t\tthis.updatePauseResumeState()\n\t}\n\n\tresumeLoadingScopes() {\n\t\tif (!this.loadingScopesPaused) return\n\t\tthis.loadingScopesPaused = false\n\t\tlog.debug(\"resumeLoadingScopes\")\n\t\tthis.updatePauseResumeState()\n\t}\n\n\tprioritizeLoadingAllData(\n\t\toptions:\n\t\t\t| {\n\t\t\t\t\tpreload: true\n\t\t\t  }\n\t\t\t| {\n\t\t\t\t\toperationName: string\n\t\t\t\t\toperationInBackground: boolean\n\t\t\t\t\tdoNotTrack?: boolean\n\t\t\t  },\n\t): () => void {\n\t\tconst isPreload = \"preload\" in options && options.preload\n\t\tif (isPreload && shouldNeverLoadRest()) return () => {}\n\n\t\tconst startTime = performance.now()\n\t\tconst shallowScopesCount = this.numberOfScopesToLoad()\n\n\t\tthis.loadAllDataPriority = Math.max(1, this.loadAllDataPriority + 1)\n\t\tlog.debug(\"prioritizeLoadingScopes:\", this.loadAllDataPriority)\n\t\tthis.updatePauseResumeState()\n\n\t\tconst doNotTrack = isPreload || (\"doNotTrack\" in options && options.doNotTrack)\n\t\tlet stopWasCalled = false\n\n\t\tconst unsubscribeMetrics = doNotTrack\n\t\t\t? undefined\n\t\t\t: this.afterAllDataLoaded(() => {\n\t\t\t\t\tif (stopWasCalled) return\n\n\t\t\t\t\tassert(\"operationName\" in options, \"operationName is required\")\n\n\t\t\t\t\tconst endTime = performance.now()\n\t\t\t\t\tconst durationMs = endTime - startTime\n\n\t\t\t\t\trecord(\"fulltree_force_load\", {\n\t\t\t\t\t\toperationName: options.operationName,\n\t\t\t\t\t\tdurationMs: Math.round(durationMs),\n\t\t\t\t\t\tbackground: options.operationInBackground,\n\t\t\t\t\t\tshallowScopesCount,\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\tconst treeMode = this.tree ? treeModeForTree(this.tree) : undefined\n\t\tconst useCrdtReporter = experiments.isOn(\"dataOnlyTree\") && (treeMode ? treeMode === \"crdt\" : isCrdt())\n\t\tconst unsubscribeCrdtReporter = useCrdtReporter\n\t\t\t? this.afterAllDataLoaded(() => {\n\t\t\t\t\tif (stopWasCalled) return\n\t\t\t\t\tassert(!(\"preload\" in options), \"preload should never load all data\")\n\n\t\t\t\t\tconst extras = {\n\t\t\t\t\t\toperationName: options.operationName,\n\t\t\t\t\t\tdurationMs: Math.round(performance.now() - startTime),\n\t\t\t\t\t\tbackground: options.operationInBackground,\n\t\t\t\t\t\tshallowScopesCount,\n\t\t\t\t\t}\n\n\t\t\t\t\tlog.reportError(new Error(\"Full tree loaded\"), extras, {\n\t\t\t\t\t\toperationName: options.operationName,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t: undefined\n\n\t\treturn () => {\n\t\t\tif (stopWasCalled) return\n\t\t\tstopWasCalled = true\n\t\t\tunsubscribeMetrics?.()\n\t\t\tunsubscribeCrdtReporter?.()\n\t\t\tthis.stopPrioritizingLoadingAllData()\n\t\t}\n\t}\n\n\tprivate stopPrioritizingLoadingAllData() {\n\t\tthis.loadAllDataPriority -= 1\n\t\tlog.debug(\"stopPrioritizingLoadingScopes:\", this.loadAllDataPriority)\n\t\tthis.updatePauseResumeState()\n\t}\n\n\tdebugPause() {\n\t\tif (this.debugPaused) return\n\t\tthis.debugPaused = true\n\t\tlog.debug(\"debugPause\")\n\t\tthis.updatePauseResumeState()\n\t}\n\n\tdebugResume() {\n\t\tif (!this.debugPaused) return\n\t\tthis.debugPaused = false\n\t\tlog.debug(\"debugResume\")\n\t\tthis.updatePauseResumeState()\n\t}\n\n\tisDebugPaused() {\n\t\treturn this.debugPaused\n\t}\n\n\tafterAllDataLoaded(cb: () => void): Unsubscribe\n\tafterAllDataLoaded(): Promise<void>\n\tafterAllDataLoaded(cb?: () => void): Promise<void> | Unsubscribe {\n\t\tconst done = this.scopesToLoad.size === 0\n\n\t\tif (cb) {\n\t\t\tlet cancelled = false\n\t\t\tconst wrappedCb = () => {\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\tif (cancelled) return\n\t\t\t\t\tcb()\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (done) {\n\t\t\t\twrappedCb()\n\t\t\t\treturn () => {\n\t\t\t\t\tcancelled = true\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.once(\"loadedAllData\", wrappedCb)\n\t\t\treturn () => {\n\t\t\t\tcancelled = true\n\t\t\t\tthis.off(\"loadedAllData\", wrappedCb)\n\t\t\t}\n\t\t}\n\n\t\tif (done) return Promise.resolve()\n\t\treturn new Promise(resolve => {\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tthis.once(\"loadedAllData\", resolve)\n\t\t\t})\n\t\t})\n\t}\n\n\t/** Used to start on a new tree if we needed to run error recovery. */\n\tprotected tree: CanvasTree | undefined\n\n\tasync start(): Promise<void> {\n\t\tawait this.scheduler.run(async () => {\n\t\t\tlog.debug(\"start\")\n\t\t\tmarkLoadingPerf(\"parsingInit\")\n\n\t\t\tthis.updatePauseResumeState()\n\n\t\t\tconst start = performance.now()\n\t\t\tconst data = await this.loadData()\n\n\t\t\tthis.loadingDuration = performance.now() - start\n\t\t\tmarkLoadingPerf(\"documentBytesReady\")\n\t\t\tconst dataBytes = typeof data === \"string\" ? data.length : data.byteLength\n\t\t\tsetLoadingInfo({\n\t\t\t\tformat: data instanceof Uint8Array ? \"crdt\" : \"json\",\n\t\t\t\tstrategy: \"full-load\",\n\t\t\t\tsources: [\"tree-download\"],\n\t\t\t\tsnapshotBytes: dataBytes,\n\t\t\t\tsnapshotSource: \"downloaded\",\n\t\t\t\tcachedRows: 0,\n\t\t\t\tcachedRowBytes: 0,\n\t\t\t\tdownloadedRows: 0,\n\t\t\t\tdownloadedRowBytes: 0,\n\t\t\t})\n\t\t\tawait this.scheduler.yield()\n\n\t\t\tif (!this.settings.partialParsing || (typeof data === \"string\" && !isParsableDocument(data))) {\n\t\t\t\treturn this.parseFullDocumentSync(data)\n\t\t\t}\n\n\t\t\tconst parser = await this.loadDocumentVersion(data)\n\n\t\t\tawait this.scheduler.yield()\n\n\t\t\tthis.tree = await this.loadFirstTree(parser)\n\t\t\tawait this.loadAllScopesAsync()\n\t\t})\n\t}\n\n\tprotected async loadAllScopesAsync(): Promise<void> {\n\t\tthis.loadedFirstScope = true\n\n\t\t// At this point we might switch to background mode, or even pause.\n\t\tthis.updatePauseResumeState()\n\t\tawait this.scheduler.yield()\n\n\t\tmarkLoadingPerf(\"parsingResume\")\n\n\t\tlet scopeId: string | undefined\n\t\twhile ((scopeId = this.nextScopeIdToLoad()) !== undefined) {\n\t\t\tawait this.loadScopeAsync(scopeId)\n\t\t\t// before parsing each next scope, we check if we need to pause/resume to prevent unnecessary loading\n\t\t\t// for example when we have loading paused we should first wait until resume is called\n\t\t\tthis.updatePauseResumeState()\n\t\t\tawait this.scheduler.yield()\n\t\t}\n\n\t\tawait this.emitWrapped(() => {\n\t\t\tassert(this.tree, \"tree must have been set\")\n\t\t\tthis.tree.setService(\"loader\", undefined)\n\t\t\tthis.emit(\"loadedAllData\")\n\t\t})\n\n\t\tlog.debug(\n\t\t\t\"done\",\n\t\t\thumanSize(this.documentSize),\n\t\t\t\"loading:\",\n\t\t\thumanTime(this.loadingDuration),\n\t\t\t\"parsing:\",\n\t\t\thumanTime(this.parsingDuration),\n\t\t)\n\t}\n\n\tprotected async loadData(): Promise<string | Uint8Array> {\n\t\tif (this.settings.loadedData) {\n\t\t\treturn this.settings.loadedData\n\t\t}\n\n\t\tlog.debug(\"Document in cache is not up to date. Tree version:\", this.treeVersion)\n\n\t\tconst initData = this.settings.initData\n\t\tconst treeVersionIsInitVersion = initData?.version === this.treeVersion\n\t\tconst prefetchPromise = initData?.prefetchPromise\n\t\tif (initData) {\n\t\t\t// Delete the promise, so the data isn't retained.\n\t\t\tdelete initData.prefetchPromise\n\t\t}\n\n\t\tif (treeVersionIsInitVersion && prefetchPromise) {\n\t\t\tlog.debug(\"loadData: prefetch\")\n\t\t\tconst prefetchResponse = await prefetchPromise\n\t\t\tvoid prefetchPromise\n\t\t\t\t.then(data => data.duration)\n\t\t\t\t.then(time => {\n\t\t\t\t\tmarkLoadingPerf(\"dataLoad\", time)\n\t\t\t\t})\n\t\t\t\t.catch(() => {})\n\n\t\t\tawait this.scheduler.yield()\n\n\t\t\t// Handle streaming response\n\t\t\tif (prefetchResponse.buffer) {\n\t\t\t\tlog.debug(\"loadData: prefetch bytes parser\")\n\t\t\t\tconst arrayBuffer = await prefetchResponse.buffer\n\t\t\t\tawait this.scheduler.yield()\n\n\t\t\t\tif (prefetchResponse.status < 200 || prefetchResponse.status >= 300) {\n\t\t\t\t\t// For buf errors, we need to consume the buf to get error text\n\t\t\t\t\treturn this.handleErrorAndRetry(prefetchResponse.status, \"Error loading project data\")\n\t\t\t\t}\n\n\t\t\t\treturn new Uint8Array(arrayBuffer)\n\t\t\t}\n\n\t\t\t// Handle text response\n\t\t\tif (prefetchResponse.text) {\n\t\t\t\tconst prefetchText = await prefetchResponse.text\n\t\t\t\tawait this.scheduler.yield()\n\n\t\t\t\tif (prefetchResponse.status < 200 || prefetchResponse.status >= 300) {\n\t\t\t\t\treturn this.handleErrorAndRetry(prefetchResponse.status, prefetchText)\n\t\t\t\t}\n\n\t\t\t\treturn prefetchText\n\t\t\t}\n\t\t}\n\n\t\tlog.debug(\"loadData: fetch\")\n\t\tlet authorizationHeader: RequestInit | undefined = undefined\n\t\tif (this.settings.refreshAccessToken) {\n\t\t\tauthorizationHeader = await this.settings.refreshAccessToken({})\n\t\t\tawait this.scheduler.yield()\n\t\t}\n\n\t\tconst response = await fetch(this.documentURL, authorizationHeader)\n\t\tawait this.scheduler.yield()\n\n\t\tfunction shouldUseBytesParser(res: Response): res is Response & { body: ReadableStream<Uint8Array> } {\n\t\t\tif (!res.body) return false\n\t\t\tconst hasBytes = new URLSearchParams(window.location.search).has(\"bytes\")\n\t\t\tconst hasBytesCookie = document.cookie.includes(\"bytes-parser=true\")\n\t\t\tconst isLargeFile = parseInt(res.headers.get(\"Uncompressed-Content-Length\") ?? \"0\", 10) > 200_000_000 // 200MB\n\n\t\t\tif (hasBytes) {\n\t\t\t\tdocument.cookie = \"bytes-parser=true; path=/;\"\n\t\t\t}\n\n\t\t\treturn hasBytes || hasBytesCookie || isLargeFile\n\t\t}\n\n\t\tmarkLoadingPerf(\"dataLoad\")\n\n\t\tif (response.status < 200 || response.status >= 300) {\n\t\t\t// For error cases, we still need text for error handling\n\t\t\tconst text = await response.text()\n\t\t\treturn this.handleErrorAndRetry(response.status, text)\n\t\t}\n\n\t\tif (shouldUseBytesParser(response)) {\n\t\t\tlog.debug(\"loadData: using streaming parser\")\n\t\t\tconst ab = await response.arrayBuffer()\n\t\t\treturn new Uint8Array(ab)\n\t\t} else {\n\t\t\tlog.debug(\"loadData: using text parser\")\n\t\t\tconst text = await response.text()\n\t\t\tawait this.scheduler.yield()\n\t\t\treturn text\n\t\t}\n\t}\n\n\tprivate async handleErrorAndRetry(status: number, text: string): Promise<string | Uint8Array> {\n\t\tlet retry = false\n\t\ttry {\n\t\t\tretry = JSON.parse(text).retry\n\t\t} catch (e) {\n\t\t\t// ignore\n\t\t}\n\n\t\tif (retry && this.retryCount < MAX_RETRIES) {\n\t\t\tlog.debug(\"onErrorStatusLoaded, retry:\", this.retryCount)\n\t\t\tawait this.scheduler.sleep(this.retryCount * RETRY_BACKOFF_MS + Math.random() * RETRY_BACKOFF_MS)\n\t\t\tthis.retryCount += 1\n\t\t\treturn this.loadData()\n\t\t} else if (retry) {\n\t\t\tthrow Error(\"Too many retries\")\n\t\t} else {\n\t\t\tthrow Error(`Fetch Error: ${status} - ${text}`)\n\t\t}\n\t}\n\n\tprivate parseFullDocumentSync(data: string | Uint8Array) {\n\t\t// Full document sync parsing only supports string data\n\t\tif (typeof data !== \"string\") {\n\t\t\tthrow new Error(\"Full document sync parsing requires string data, not ReadableStream\")\n\t\t}\n\t\tconst start = performance.now()\n\t\tthis.documentSize = data.length\n\n\t\tconst json = JSON.parse(data)\n\n\t\tif (!isNumber(json.version)) {\n\t\t\tthrow Error(\"cannot read document version\")\n\t\t}\n\n\t\tthis.canvasTreeVersion = json.version\n\t\tlog.debug(\n\t\t\t\"parseFullDocumentSync\",\n\t\t\tthis.canvasTreeVersion,\n\t\t\thumanSize(this.documentSize),\n\t\t\thumanTime(this.loadingDuration),\n\t\t)\n\n\t\tthis.emit(\"loadedDocumentVersion\", json.version)\n\t\tif (this.scheduler.isDone()) return\n\n\t\tconst tree = loadDocumentJSON(json, this.componentLoader)\n\n\t\tthis.emit(\"loadedFirstData\", tree)\n\t\tif (this.scheduler.isDone()) return\n\n\t\tthis.emit(\"loadedAllData\")\n\t\tthis.parsingDuration += performance.now() - start\n\t\tmarkLoadingPerf(\"parsingFirstPage\")\n\t\tlog.debug(\n\t\t\t\"done\",\n\t\t\thumanSize(this.documentSize),\n\t\t\t\"loading:\",\n\t\t\thumanTime(this.loadingDuration),\n\t\t\t\"parsing:\",\n\t\t\thumanTime(this.parsingDuration),\n\t\t)\n\t}\n\n\t/**\n\t * Loader interface\n\t * @see Loader.hasLoadedScope */\n\thasLoadedScope(id: string): boolean {\n\t\tconst stillToLoad = this.scopesToLoad.has(id)\n\t\tconst currentlyLoading = this.currentLoadingScope?.id === id\n\t\treturn !stillToLoad && !currentlyLoading\n\t}\n\n\t/**\n\t * Loader interface\n\t * @see Loader.numberOfScopesToLoad */\n\tnumberOfScopesToLoad(): number {\n\t\treturn this.scopesToLoad.size\n\t}\n\n\t/**\n\t * Loader interface\n\t * @see Loader.prioritizeLoadingScope */\n\tprioritizeLoadingScope(id: string, options?: PrioritizeLoadingOptions): Promise<void>\n\tprioritizeLoadingScope(id: string, options: PrioritizeLoadingOptionsWithCallback): void\n\tprioritizeLoadingScope(id: string, onLoaded: PrioritizeLoadingOptionsWithCallback[\"onLoaded\"]): void\n\tprioritizeLoadingScope(\n\t\tid: string,\n\t\tonLoaded?: (() => void) | PrioritizeLoadingOptions | PrioritizeLoadingOptionsWithCallback,\n\t): Promise<void> | undefined {\n\t\tlet promise: Promise<void> | undefined\n\t\tlet options: PrioritizeLoadingOptions | undefined\n\t\tif (typeof onLoaded === \"function\") {\n\t\t\tthis.addScopeLoadCallback(id, onLoaded)\n\t\t} else if (onLoaded && \"onLoaded\" in onLoaded) {\n\t\t\tthis.addScopeLoadCallback(id, onLoaded.onLoaded)\n\t\t\toptions = onLoaded\n\t\t} else {\n\t\t\tconst resolvablePromise = new ResolvablePromise<void>()\n\t\t\tpromise = resolvablePromise\n\t\t\tthis.addScopeLoadCallback(id, resolvablePromise.resolve)\n\t\t\toptions = onLoaded\n\t\t}\n\n\t\tif (options?.preload && shouldNeverLoadRest()) return\n\n\t\tif (!this.scopesToLoad.has(id)) {\n\t\t\t// Callback will be called inside this.addScopeLoadCallback\n\t\t\treturn promise\n\t\t}\n\n\t\tthis.prioritizedScopeIds.add(id)\n\t\tthis.updatePauseResumeState()\n\n\t\tthis.addScopeLoadCallback(id, this.updatePauseResumeState)\n\n\t\treturn promise\n\t}\n\n\tprivate nextScopeIdToLoad() {\n\t\tfor (const id of this.prioritizedScopeIds) {\n\t\t\tthis.prioritizedScopeIds.delete(id)\n\t\t\tif (!this.scopesToLoad.has(id)) continue\n\t\t\tthis.scopesToLoad.delete(id)\n\n\t\t\tthis.scheduler.fast()\n\t\t\treturn id\n\t\t}\n\n\t\tconst priority = this.loadAllDataPriority > 0\n\t\tif (this.settings.loadInBackground && !priority) {\n\t\t\tthis.scheduler.slow()\n\t\t} else {\n\t\t\tthis.scheduler.fast()\n\t\t}\n\n\t\tfor (const id of this.scopesToLoad) {\n\t\t\tthis.scopesToLoad.delete(id)\n\t\t\treturn id\n\t\t}\n\n\t\treturn undefined\n\t}\n\n\tprivate async loadDocumentVersion(data: string | Uint8Array): Promise<PartialParser> {\n\t\tconst start = performance.now()\n\n\t\t// Use static factory method for cleaner parser creation\n\t\tconst parser = await PartialDocumentParser.createPartialParser(data, this.componentLoader, this.settings)\n\n\t\t// Set document metadata\n\t\tif (typeof data === \"string\") {\n\t\t\tthis.documentSize = data.length\n\t\t} else {\n\t\t\t// For streams, we estimate size after first page is read\n\t\t\tthis.documentSize = 0 // Will be updated as we read\n\t\t}\n\n\t\tthis.canvasTreeVersion = parser.canvasTreeVersion\n\t\tthis.parsingDuration += performance.now() - start\n\t\tlog.debug(\n\t\t\t\"loadDocumentVersion\",\n\t\t\tthis.canvasTreeVersion,\n\t\t\ttypeof data === \"string\" ? humanSize(this.documentSize) : \"stream\",\n\t\t\thumanTime(this.loadingDuration),\n\t\t)\n\n\t\tawait this.emitWrapped(() => {\n\t\t\tif (this.scheduler.isDone()) return\n\t\t\tconst start = performance.now()\n\t\t\tthis.emit(\"loadedDocumentVersion\", this.canvasTreeVersion)\n\t\t\tthis.parsingDuration += performance.now() - start\n\t\t})\n\n\t\tthis.partialParser = parser\n\t\treturn parser\n\t}\n\n\tprivate async loadFirstTree(parser: PartialParser): Promise<CanvasTree> {\n\t\tconst start = performance.now()\n\t\tconst tree = parser.readFirstPage()\n\t\tthis.scopesToLoad = parser.getScopesToLoad()\n\n\t\tfor (const id of this.scopesToLoad) {\n\t\t\tconst scope = tree.get(id)\n\t\t\tif (!scope) continue\n\t\t\tscope.cache.isShallowLoad = true\n\t\t}\n\n\t\tthis.parsingDuration += performance.now() - start\n\t\tlog.debug(\"loadFirstTree\", humanTime(this.parsingDuration))\n\n\t\tawait this.emitWrapped(() => {\n\t\t\tif (this.scheduler.isDone()) return\n\t\t\tconst start = performance.now()\n\t\t\ttree.setService(\"loader\", this)\n\t\t\t// Store chunking hints on tree for PartialTreeSender access (persists after loader is removed)\n\t\t\ttree.chunkingHints = parser.chunkingHints\n\t\t\tthis.emit(\"loadedFirstData\", tree)\n\t\t\tmarkLoadingPerf(\"parsingFirstPage\")\n\t\t\tthis.parsingDuration += performance.now() - start\n\t\t})\n\n\t\treturn tree\n\t}\n\n\tprivate async loadScopeAsync(id: string): Promise<void> {\n\t\t// loadNextScopeAsync is called slowly in the background, while loadScope might be called at\n\t\t// anytime to load a scope blocking in the foreground. We make sure that a loaded scope is\n\t\t// either returned by loadScope() or by emit(\"loadedScope\"). That is what the LoadingScope\n\t\t// and LoadedScope are designed to help with.\n\n\t\t// we want scopes to strictly load one after another, like in a thread\n\t\tassert(!this.currentLoadingScope, \"already have a currently loading scope\")\n\t\tthis.activelyLoadingScope = true\n\t\tthis.currentLoadingScope = this.createLoadingScope(id)\n\t\tconst loadedScope = await this.currentLoadingScope.run(this.scheduler)\n\t\tlog.debug(\"loadScopeAsync:\", id, humanTime(loadedScope.duration), `scheduler mode:`, this.scheduler.currentMode())\n\n\t\tif (!loadedScope.hasNode()) {\n\t\t\tthis.activelyLoadingScope = false\n\t\t\treturn\n\t\t}\n\n\t\tawait this.emitWrapped(() => {\n\t\t\tthis.activelyLoadingScope = false\n\t\t\tif (this.scheduler.isDone()) return\n\t\t\tconst start = performance.now()\n\t\t\tconst scope = loadedScope.take()\n\t\t\tthis.currentLoadingScope = undefined\n\t\t\tif (!scope) return\n\t\t\t// eslint-disable-next-line framer-studio/no-mutable-node-type-operations\n\t\t\tthis.emit(\"loadedScope\", scope)\n\t\t\tthis.parsingDuration += loadedScope.duration + performance.now() - start\n\t\t\tthis.signalScopeLoadCallbacks(scope.id)\n\t\t})\n\t}\n\n\tprotected createLoadingScope(id: string): LoadingScopeInterface {\n\t\tassert(this.partialParser, \"loadScope before the parser is available\")\n\t\treturn new LoadingScope(id, this.partialParser)\n\t}\n\n\tloadScope(id: string): CanvasNode | undefined {\n\t\t// If the scope is already busy loading, we force load it, and take the result. The\n\t\t// loadScopeAsync() can deal with this happening.\n\t\tif (this.currentLoadingScope?.id === id) {\n\t\t\tconst loadedScope = this.currentLoadingScope.force()\n\t\t\tthis.parsingDuration += loadedScope.duration\n\t\t\tthis.currentLoadingScope = undefined\n\t\t\treturn loadedScope.take()\n\t\t}\n\n\t\t// Otherwise delete the id from the sets, which also makes sure the background loading will\n\t\t// never start working on this scope.\n\t\tthis.prioritizedScopeIds.delete(id)\n\t\tif (!this.scopesToLoad.has(id)) return\n\n\t\tthis.scopesToLoad.delete(id)\n\t\tconst loadedScope = this.createLoadingScope(id).force()\n\t\tthis.parsingDuration += loadedScope.duration\n\t\tlog.debug(\"loadScope:\", id, humanTime(loadedScope.duration))\n\t\tthis.signalScopeLoadCallbacks(id)\n\t\treturn loadedScope.take()\n\t}\n\n\tloadCallbacksPerScope = new Map<string, (() => void)[]>()\n\n\taddScopeLoadCallback(id: string, callback?: () => void) {\n\t\tif (!callback) return\n\n\t\tif (this.hasLoadedScope(id)) {\n\t\t\tsetTimeout(callback)\n\t\t\treturn\n\t\t}\n\n\t\tconst callbacks = this.loadCallbacksPerScope.get(id) ?? []\n\t\tcallbacks.push(callback)\n\t\tthis.loadCallbacksPerScope.set(id, callbacks)\n\t}\n\n\tsignalScopeLoadCallbacks(id: string) {\n\t\tsetTimeout(() => {\n\t\t\tconst callbacks = this.loadCallbacksPerScope.get(id)\n\t\t\tif (!callbacks) return\n\n\t\t\tfor (const callback of callbacks) {\n\t\t\t\tcallback()\n\t\t\t}\n\t\t\tthis.loadCallbacksPerScope.delete(id)\n\t\t})\n\t}\n\n\tprotected async emitWrapped(operation: () => void) {\n\t\tif (this.settings.asyncEventWrapper) {\n\t\t\tawait this.scheduler.yield()\n\t\t\tawait this.settings.asyncEventWrapper(operation)\n\t\t} else {\n\t\t\tawait this.scheduler.yield()\n\t\t\toperation()\n\t\t}\n\t}\n\n\tresetTreeForRecovery(tree: CanvasTree) {\n\t\t// Install this loader as a service.\n\t\ttree.setService(\"loader\", this)\n\n\t\t// Mark all scopes still to be loaded as shallow.\n\t\tfor (const id of this.scopesToLoad) {\n\t\t\tconst scope = tree.get(id)\n\t\t\tif (!scope) continue\n\t\t\tscope.cache.isShallowLoad = true\n\t\t}\n\n\t\t// And make sure we continue working on this tree and not the original one.\n\t\tthis.tree = tree\n\t}\n\n\t/** Returns a set of node ids that haven't loaded yet, but are in the snapshot from which we are loading. */\n\tasync nodeIdsToLoad(): Promise<Set<string>> {\n\t\tconst start = performance.now()\n\t\tconst nodeIds = new Set<string>()\n\n\t\tif (!this.partialParser) return nodeIds\n\n\t\tlet startOfBatch = performance.now()\n\t\tfor (const scopeId of this.scopesToLoad) {\n\t\t\tif (performance.now() - startOfBatch > 50) {\n\t\t\t\tawait schedulerYield()\n\t\t\t\tstartOfBatch = performance.now()\n\t\t\t}\n\t\t\tconst value = this.partialParser.getParsedPageById(scopeId)\n\t\t\tcollectNodeIds(nodeIds, value)\n\t\t}\n\n\t\tfor (const id of this.addedByDiff) {\n\t\t\tnodeIds.add(id)\n\t\t}\n\n\t\tfor (const id of this.removedByDiff) {\n\t\t\tnodeIds.delete(id)\n\t\t}\n\n\t\tlog.debug(\"nodeIdsToLoad\", nodeIds.size, humanTime(performance.now() - start))\n\n\t\treturn nodeIds\n\t}\n\n\tprotected addedByDiff = new Set<string>()\n\tprotected removedByDiff = new Set<string>()\n\n\t/** The loader tracks nodes that are added or removed. So it can return an up to date set of ids still to load. */\n\taddNodeChanges(change: NodeChange[]) {\n\t\tfor (const nodeChange of change) {\n\t\t\tconst id = nodeChange.id\n\t\t\tif (nodeChange.added) {\n\t\t\t\tthis.addedByDiff.add(id)\n\t\t\t\tthis.removedByDiff.delete(id)\n\t\t\t} else if (nodeChange.removed) {\n\t\t\t\tthis.addedByDiff.delete(id)\n\t\t\t\tthis.removedByDiff.add(id)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction collectNodeIds(nodeIds: Set<string>, value: SnapshotNode | null | undefined) {\n\tif (!value) return\n\tnodeIds.add(value.id)\n\n\tif (!value.children) return\n\tfor (const child of value.children) {\n\t\tcollectNodeIds(nodeIds, child)\n\t}\n}\n\n/** An object to hold a loaded scope, and make sure it will be used only once. */\nexport class LoadedScope {\n\tconstructor(\n\t\tprivate node: CanvasNode | undefined,\n\t\treadonly duration: number,\n\t) {}\n\n\thasNode(): boolean {\n\t\treturn !!this.node\n\t}\n\n\t/** Will return the node if any, and clear the node from the LoadedScope object. Any second call\n\t * will return undefined. */\n\ttake(): CanvasNode | undefined {\n\t\tconst node = this.node\n\t\tthis.node = undefined\n\t\treturn node\n\t}\n}\n\nexport interface LoadingScopeInterface {\n\treadonly id: string\n\trun(context: TaskScheduler): Promise<LoadedScope>\n\tforce(): LoadedScope\n}\n\n/** An object that can load a scope in steps. Will result in a LoadedScope. Can also be forced to\n * load blocking. */\nclass LoadingScope implements LoadingScopeInterface {\n\tprivate data: SnapshotNode | null | undefined = undefined\n\tprivate loadedScope: LoadedScope | undefined = undefined\n\n\tconstructor(\n\t\treadonly id: string,\n\t\tprivate readonly parser: PartialParser,\n\t) {}\n\n\tasync run(taskScheduler: TaskScheduler): Promise<LoadedScope> {\n\t\tif (this.loadedScope) return this.loadedScope\n\n\t\tconst parseStart = performance.now()\n\t\tthis.data = this.parser.getParsedPageById(this.id)\n\t\tconst parseDuration = performance.now() - parseStart\n\n\t\tawait taskScheduler.yield()\n\t\tif (this.loadedScope) return this.loadedScope\n\n\t\tconst buildStart = performance.now()\n\t\tconst scope = this.parser.buildPage(this.data)\n\t\tif (scope) {\n\t\t\tscope.cache.isShallowLoad = false\n\t\t}\n\t\tthis.loadedScope = new LoadedScope(scope, parseDuration + performance.now() - buildStart)\n\t\treturn this.loadedScope\n\t}\n\n\tforce(): LoadedScope {\n\t\tif (this.loadedScope) return this.loadedScope\n\n\t\tconst start = performance.now()\n\t\tif (!this.data) {\n\t\t\tthis.data = this.parser.getParsedPageById(this.id)\n\t\t}\n\t\tconst scope = this.parser.buildPage(this.data)\n\t\tif (scope) {\n\t\t\tscope.cache.isShallowLoad = false\n\t\t}\n\t\tthis.loadedScope = new LoadedScope(scope, performance.now() - start)\n\t\treturn this.loadedScope\n\t}\n}\n", "import { MAIN_BRANCH_ID, type Store, Table, groupRowsByBranch } from \"@framerjs/crdtree2\"\nimport type { SnapshotNode } from \"@framerjs/document-snapshotter\"\nimport { pagesToAlwaysLoad } from \"@framerjs/document-snapshotter/src/serializer/config.ts\"\nimport type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { assert, getLogger } from \"@framerjs/shared\"\nimport type { CrdtCacheData, RowsWithVersion } from \"document/crdt/sync/LocalCache.ts\"\nimport {\n\tcanRenderPageTypeBeforeDocumentHasFullyLoaded,\n\tdetermineFirstPage,\n\tfindFirstScopes,\n} from \"document/firstScopeFinder.ts\"\nimport {\n\tDocumentLoader,\n\ttype DocumentLoaderSettings,\n\tLoadedScope,\n\ttype LoadingScopeInterface,\n\tMAX_RETRIES,\n\tRETRY_BACKOFF_MS,\n\thumanSize,\n\thumanTime,\n} from \"document/loader/DocumentLoader.ts\"\nimport type { TaskScheduler } from \"document/loader/TaskScheduler.ts\"\nimport { repairCycleInNode, repairPage, repairRootNode } from \"document/models/CanvasTree/TreeRepair.ts\"\nimport {\n\ttype AnyWebPageNode,\n\ttype CanvasNode,\n\tCanvasTree,\n\ttype RootNode,\n\ttype ScopeNode,\n} from \"document/models/CanvasTree/index.ts\"\nimport { TemplateHelper } from \"document/models/CanvasTree/nodes/TemplateHelper.ts\"\nimport { type ValueNode, canvasNodeFromValue } from \"document/models/CanvasTree/nodes/canvasNodeFromValue.ts\"\nimport { isWebPageNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { type DetectedCycles, checkTreeForCycles } from \"document/models/CanvasTree/traits/utils/checkTreeForCycles.ts\"\nimport type { PrefetchSyncPromise } from \"document/stores/TreeStore.ts\"\nimport { isNumber } from \"library/utils/utils.ts\"\nimport {\n\ttype LoadingSource,\n\tloadingStartTime,\n\tmarkLoadingPerf,\n\tperfEmitter,\n\tsetLoadingInfo,\n} from \"utils/performanceTracker.ts\"\nimport { getCrdtSession } from \"../CrdtSession.ts\"\nimport type { CrdtBranchStoreRegistry } from \"./CrdtBranchStoreRegistry.ts\"\n\nclass LoadingCrdtScope implements LoadingScopeInterface {\n\tprivate loadedScope?: LoadedScope\n\tconstructor(\n\t\treadonly id: string,\n\t\tprivate store: Store,\n\t) {}\n\n\tprivate loadScopeDataFromStore(): SnapshotNode | undefined {\n\t\tconst scopeNodeData = this.store.getObject<SnapshotNode>(this.id)\n\t\tif (!scopeNodeData) {\n\t\t\tlog.debug(\"No object with id \" + this.id + \" in the store\")\n\t\t\treturn undefined\n\t\t}\n\t\treturn scopeNodeData\n\t}\n\tprivate createNodeFromData(scopeNodeData?: SnapshotNode) {\n\t\tconst scope = this.buildPage(scopeNodeData)\n\t\tif (!scope) return undefined\n\t\tscope.cache.isShallowLoad = false\n\t\treturn scope\n\t}\n\tasync run(taskScheduler: TaskScheduler): Promise<LoadedScope> {\n\t\tif (this.loadedScope) return this.loadedScope\n\n\t\tconst parseStart = performance.now()\n\t\tconst scopeData = this.loadScopeDataFromStore()\n\t\tconst parseDuration = performance.now() - parseStart\n\n\t\tawait taskScheduler.yield()\n\t\tif (this.loadedScope) return this.loadedScope\n\n\t\tconst buildStart = performance.now()\n\t\tconst scopeNode = this.createNodeFromData(scopeData)\n\t\tconst buildDuration = performance.now() - buildStart\n\t\tthis.loadedScope = new LoadedScope(scopeNode, parseDuration + buildDuration)\n\t\treturn this.loadedScope\n\t}\n\tforce(): LoadedScope {\n\t\tif (this.loadedScope) return this.loadedScope\n\n\t\tconst parseStart = performance.now()\n\t\tconst scopeData = this.loadScopeDataFromStore()\n\t\tconst scopeNode = this.createNodeFromData(scopeData)\n\t\tconst buildDuration = performance.now() - parseStart\n\t\tthis.loadedScope = new LoadedScope(scopeNode, buildDuration)\n\t\treturn this.loadedScope\n\t}\n\tprivate buildPage(data: SnapshotNode | null | undefined): CanvasNode | undefined {\n\t\tif (!data) return undefined\n\t\tconst errors: string[] = []\n\t\tconst warnings: string[] | undefined = log.isLoggingTraceMessages() ? [] : undefined\n\n\t\tconst page = canvasNodeFromValue(data, undefined, { extraChecksAndFixes: true, errors, warnings })\n\t\tif (page) {\n\t\t\trepairPage(page, errors)\n\t\t}\n\t\tif (errors.length > 0) {\n\t\t\tlog.warn(\"errors loading server tree: \" + errors.join(\"\\n\"))\n\t\t}\n\t\tif (warnings && warnings.length > 0) {\n\t\t\tlog.trace(\"warnings loading server tree: \" + warnings.join(\"\\n\"))\n\t\t}\n\t\tif (!page) return undefined\n\t\treturn page\n\t}\n}\n\nconst log = getLogger(\"CrdtDocumentLoader\")\n\nexport class CrdtDocumentLoader extends DocumentLoader {\n\tprivate parsedIds: Set<string> = new Set()\n\n\tconstructor(\n\t\tprivate store: Store,\n\t\tprivate projectId: string | undefined,\n\t\tcomponentLoader: ComponentLoader,\n\t\ttreeVersion: number,\n\t\tdocumentURL: string,\n\t\tsettings: DocumentLoaderSettings,\n\t\tprivate readonly branches?: CrdtBranchStoreRegistry,\n\t) {\n\t\tsuper(componentLoader, treeVersion, documentURL, settings)\n\t}\n\n\t/**\n\t * If the buffer's seq is behind the persisted watermark for this client+project+branch,\n\t * bump store.seq to avoid reusing (client, seq) pairs that already exist.\n\t * This could happen when the buffer is stale or rows are still in-flight.\n\t *\n\t * Applies eagerly to the main store (always loaded) and lazily to branch\n\t * stores via {@link CrdtBranchStoreRegistry.onStoreCreated}.\n\t */\n\tprivate applySeqWatermark() {\n\t\tif (!this.projectId) return\n\n\t\tthis.applySeqWatermarkToStore(this.store)\n\n\t\tif (this.branches) {\n\t\t\tthis.branches.onStoreCreated = (store: Store) => this.applySeqWatermarkToStore(store)\n\t\t}\n\t}\n\n\tprivate applySeqWatermarkToStore(store: Store) {\n\t\tif (!this.projectId) return\n\n\t\tconst watermark = getCrdtSession().getSeqWatermark(this.projectId, store.branchId)\n\t\tif (watermark === undefined) return\n\n\t\tconst { from, to } = store.ensureMinSeq(watermark)\n\n\t\tif (from !== to) {\n\t\t\tlog.warn(\"seq watermark applied\", {\n\t\t\t\tprojectId: this.projectId,\n\t\t\t\tbranchId: store.branchId,\n\t\t\t\tfrom,\n\t\t\t\tto,\n\t\t\t\tdelta: to - from,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate loadFirstCrdtTreeFromStore(meta: { rootId: string; version: number }): CanvasTree {\n\t\tconst errors: string[] = []\n\t\tconst DEPTH_TO_ROOT_CHILDREN = 1\n\n\t\tconst rawRoot = this.store.getObjectWithShallowChildren<ValueNode>(meta.rootId, DEPTH_TO_ROOT_CHILDREN)\n\t\tassert(rawRoot, \"Root object not found in store\")\n\n\t\tconst pagesToLoad = [...pagesToAlwaysLoad]\n\n\t\tlet firstFoundPages: ReturnType<typeof findFirstScopes> | undefined\n\n\t\tconst activeNodeId = this.settings.activeNodeId\n\t\tlet rawActiveNodeData = activeNodeId\n\t\t\t? this.store.getObjectWithShallowChildren<ScopeNode>(activeNodeId, DEPTH_TO_ROOT_CHILDREN)\n\t\t\t: undefined\n\t\twhile (rawActiveNodeData && rawActiveNodeData.parentid !== meta.rootId) {\n\t\t\tif (!rawActiveNodeData.parentid) throw Error(\"active node has no parent\")\n\t\t\trawActiveNodeData = this.store.getObjectWithShallowChildren<ScopeNode>(\n\t\t\t\trawActiveNodeData.parentid,\n\t\t\t\tDEPTH_TO_ROOT_CHILDREN,\n\t\t\t)\n\t\t}\n\n\t\tif (canRenderPageTypeBeforeDocumentHasFullyLoaded(rawActiveNodeData)) {\n\t\t\tpagesToLoad.push(rawActiveNodeData.id)\n\t\t} else {\n\t\t\tfirstFoundPages = findFirstScopes(rawRoot.children ?? [], rawRoot?.homePageNodeId)\n\t\t\tpagesToLoad.push(firstFoundPages.maybeFirstPage.id)\n\t\t}\n\n\t\tconst root = canvasNodeFromValue(rawRoot, null, {\n\t\t\textraChecksAndFixes: true,\n\t\t\terrors,\n\t\t\twarnings: errors, // Also, let warnings be pushed into errors. To retain the original behavior.\n\t\t}) as RootNode | undefined\n\t\tassert(root, \"Unable to load document\")\n\n\t\tfor (const child of root.children) {\n\t\t\tchild.cache.isShallowLoad = true\n\t\t}\n\n\t\tfor (const scopeId of pagesToLoad) {\n\t\t\tif (!scopeId) continue\n\n\t\t\tconst rawPage = this.store.getObject<ValueNode>(scopeId)\n\t\t\tif (!rawPage) {\n\t\t\t\tlog.debug(\"No value for \" + scopeId)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst pageNode = canvasNodeFromValue(rawPage)\n\t\t\tassert(pageNode, \"Scope node instance could not be created\")\n\n\t\t\tpageNode.cache.isShallowLoad = false\n\t\t\tconst scopeIndex = root.children.findIndex(scope => scope.id === scopeId)\n\t\t\tif (scopeIndex >= 0) {\n\t\t\t\troot.children.splice(scopeIndex, 1, pageNode)\n\t\t\t}\n\t\t\tthis.parsedIds.add(scopeId)\n\n\t\t\t// We need to enqueue the first design page for loading if\n\t\t\t//   1. nodeId query param is not provided in the URL (= firstFoundPages is defined)\n\t\t\t//   2. First found page is an **empty** webpage\n\t\t\t//   3. Project has a design page\n\t\t\tconst pageNodeAsScope = pageNode as unknown as AnyWebPageNode\n\t\t\tif (\n\t\t\t\tscopeId === firstFoundPages?.maybeFirstPage.id &&\n\t\t\t\tfirstFoundPages.firstDesignPage &&\n\t\t\t\tdetermineFirstPage(pageNodeAsScope, firstFoundPages.firstDesignPage) !== pageNodeAsScope\n\t\t\t) {\n\t\t\t\tpagesToLoad.push(firstFoundPages.firstDesignPage.id)\n\t\t\t}\n\t\t}\n\n\t\trepairRootNode(root, errors)\n\n\t\tfor (const child of root.children) {\n\t\t\tif (this.parsedIds.has(child.id)) continue\n\t\t\tthis.scopesToLoad.add(child.id)\n\t\t}\n\n\t\troot.children.forEach(child => {\n\t\t\tif (!this.parsedIds.has(child.id) && Array.isArray(child.children) && isWebPageNode(child)) {\n\t\t\t\tchild.cache.isShallowLoad = true\n\t\t\t\treturn\n\t\t\t}\n\t\t})\n\n\t\tlet tree = CanvasTree.createByAdoptingRoot(root, { mode: \"crdt\" })\n\t\ttree.verify()\n\t\ttree = TemplateHelper.treeDidLoad(tree, this.componentLoader, []).didNonLinearMove(this.componentLoader)\n\t\tconst cycles: DetectedCycles = []\n\t\tif (checkTreeForCycles(tree, cycles)) {\n\t\t\tcycles.forEach(cycle => {\n\t\t\t\terrors.push(`${cycle.id}: code component links itself via ${cycle.stack}`)\n\t\t\t\trepairCycleInNode(tree, cycle.id, cycle.stack)\n\t\t\t})\n\t\t\ttree = tree.commit(this.componentLoader)\n\t\t}\n\t\ttree.setService(\"loader\", this)\n\t\treturn tree\n\t}\n\n\tprivate async loadFirstCrdtTree(meta: { rootId: string; version: number }): Promise<CanvasTree> {\n\t\tconst tree = this.loadFirstCrdtTreeFromStore(meta)\n\n\t\tawait this.emitWrapped(() => {\n\t\t\tif (this.scheduler.isDone()) return\n\t\t\tconst start = performance.now()\n\t\t\tthis.emit(\"loadedFirstData\", tree)\n\t\t\tmarkLoadingPerf(\"parsingFirstPage\")\n\t\t\tthis.parsingDuration += performance.now() - start\n\t\t})\n\n\t\treturn tree\n\t}\n\n\tprivate async createTreeFromBuffer(data: Uint8Array) {\n\t\tthis.documentSize = data.byteLength\n\n\t\tconst binaryVersion = Table.loadVersionFromBuffer(data)\n\t\tthis.emit(\"loadedFormatVersion\", binaryVersion)\n\t\tif (this.scheduler.isCancelled()) {\n\t\t\tthis.store.reset()\n\t\t\tthis.branches?.reset()\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tthis.store.fromBuffer(data)\n\t\t\tthis.branches?.reset()\n\t\t\tthis.applySeqWatermark()\n\t\t\tmarkLoadingPerf(\"buildStore\")\n\t\t\tconst meta = this.store.getObject<{ rootId: string; version: number }>(\"meta\")\n\n\t\t\tif (!meta) throw new Error(\"Meta field not found\")\n\n\t\t\tif (!isNumber(meta.version)) {\n\t\t\t\tthrow Error(\"cannot read document version\")\n\t\t\t}\n\n\t\t\tthis.canvasTreeVersion = meta.version\n\t\t\tlog.debug(\"createTree\", this.canvasTreeVersion, humanSize(this.documentSize), humanTime(this.loadingDuration))\n\n\t\t\tthis.emit(\"loadedDocumentVersion\", meta.version)\n\t\t\tif (this.scheduler.isCancelled()) {\n\t\t\t\tthis.store.reset()\n\t\t\t\tthis.branches?.reset()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.tree = await this.loadFirstCrdtTree(meta)\n\n\t\t\tthis.settings.localCache?.storeSnapshot(data, this.treeVersion, { syncStrategy: \"full-load\" })\n\n\t\t\tawait this.loadAllScopesAsync()\n\t\t} catch (e) {\n\t\t\tif (this.scheduler.isCancelled()) return\n\t\t\tthis.store.reset()\n\t\t\tthis.branches?.reset()\n\t\t\tthrow e\n\t\t}\n\t}\n\n\t/** Returns false if aborted and a fallback path should be taken. */\n\tprivate async createTreeFromCachedState(cached: CrdtCacheData, hierarchyHash = 0): Promise<boolean> {\n\t\tthis.documentSize = cached.snapshot.byteLength\n\n\t\tconst binaryVersion = Table.loadVersionFromBuffer(cached.snapshot)\n\t\tthis.emit(\"loadedFormatVersion\", binaryVersion)\n\t\tif (this.scheduler.isCancelled()) {\n\t\t\tthis.store.reset()\n\t\t\tthis.branches?.reset()\n\t\t\treturn true\n\t\t}\n\n\t\ttry {\n\t\t\tthis.store.fromBuffer(cached.snapshot)\n\t\t\tthis.branches?.reset()\n\t\t\tthis.applySeqWatermark()\n\t\t\tmarkLoadingPerf(\"buildStore\")\n\n\t\t\tif (cached.rows.length > 0) {\n\t\t\t\tthis.addCachedRowsToStores(cached.rows)\n\t\t\t\tmarkLoadingPerf(\"addedRows\")\n\t\t\t}\n\n\t\t\tconst meta = this.store.getObject<{ rootId: string; version: number }>(\"meta\")\n\t\t\tif (!meta) throw new Error(\"Meta field not found\")\n\n\t\t\tif (!isNumber(meta.version)) {\n\t\t\t\tthrow Error(\"cannot read document version\")\n\t\t\t}\n\n\t\t\tthis.canvasTreeVersion = meta.version\n\t\t\tlog.debug(\n\t\t\t\t\"createTreeFromCachedState\",\n\t\t\t\tthis.canvasTreeVersion,\n\t\t\t\thumanSize(this.documentSize),\n\t\t\t\thumanTime(this.loadingDuration),\n\t\t\t)\n\n\t\t\t// Before changing any state, and emitting version loaded event, if the hierarchy hash\n\t\t\t// is a mismatch, we abort the local cache and fall back to regular loading. Note, we\n\t\t\t// will have emitted loadedFormatVersion, which is unfortunate, but cannot be helped.\n\t\t\tif (hierarchyHash) {\n\t\t\t\tconst computedHierarchyHash = this.store.getHierarchy().computeTreeHash()\n\t\t\t\tif (hierarchyHash !== computedHierarchyHash) {\n\t\t\t\t\tlog.reportCriticalError(\"hierarchy hash mismatch, falling back to full document load\", {\n\t\t\t\t\t\tversion: this.treeVersion,\n\t\t\t\t\t\thierarchyHash,\n\t\t\t\t\t\tcomputedHierarchyHash,\n\t\t\t\t\t\tdocumentSize: this.documentSize,\n\t\t\t\t\t})\n\t\t\t\t\tthis.settings.localCache?.abortAndClearCache()\n\t\t\t\t\tthis.store.reset()\n\t\t\t\t\tthis.branches?.reset()\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.emit(\"loadedDocumentVersion\", meta.version)\n\t\t\tif (this.scheduler.isCancelled()) {\n\t\t\t\tthis.store.reset()\n\t\t\t\tthis.branches?.reset()\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tthis.tree = await this.loadFirstCrdtTree(meta)\n\t\t\tawait this.loadAllScopesAsync()\n\t\t\treturn true\n\t\t} catch (e) {\n\t\t\tif (this.scheduler.isCancelled()) return true\n\t\t\tthis.store.reset()\n\t\t\tthis.branches?.reset()\n\t\t\tthrow e\n\t\t}\n\t}\n\n\tprivate addCachedRowsToStores(rows: RowsWithVersion[]): void {\n\t\tfunction* iterateRows(versionedRows: RowsWithVersion[]) {\n\t\t\tfor (const entry of versionedRows) {\n\t\t\t\tfor (const row of entry.rows) {\n\t\t\t\t\tyield row\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.branches) {\n\t\t\tassert(this.store === this.branches.getStore(MAIN_BRANCH_ID), \"main store mismatch\")\n\t\t}\n\n\t\tconst rowsByBranch = groupRowsByBranch(iterateRows(rows))\n\n\t\t// Branch metadata lives in main, so we need to sync it first.\n\t\t// Otherwise, this.branches operations might throw b/c of missing metadata.\n\t\tconst mainRows = rowsByBranch.get(MAIN_BRANCH_ID)\n\t\tif (mainRows) {\n\t\t\tthis.store.addSerializableRows(mainRows)\n\t\t}\n\t\trowsByBranch.delete(MAIN_BRANCH_ID)\n\n\t\tif (rowsByBranch.size === 0) return\n\n\t\tconst branches = this.branches\n\t\tassert(branches, \"branch registry is required to load cached branch rows\")\n\n\t\tconst branchEntries = [...rowsByBranch].sort(\n\t\t\t([a], [b]) => branches.getBranchPath(a).length - branches.getBranchPath(b).length,\n\t\t)\n\t\tfor (const [branchId, branchRows] of branchEntries) {\n\t\t\tbranches.getStore(branchId).addSerializableRows(branchRows)\n\t\t}\n\t}\n\n\toverride async start(): Promise<void> {\n\t\tawait this.scheduler.run(async () => {\n\t\t\tlog.debug(\"start\")\n\t\t\tmarkLoadingPerf(\"parsingInit\")\n\n\t\t\tthis.updatePauseResumeState()\n\n\t\t\tconst sources: LoadingSource[] = []\n\t\t\tconst start = performance.now()\n\n\t\t\tconst localCache = this.settings.localCache\n\t\t\tif (localCache && !localCache.aborted) {\n\t\t\t\ttry {\n\t\t\t\t\tconst isPrefetch = !!this.settings.initData?.prefetchSyncPromise\n\t\t\t\t\tsources.push(isPrefetch ? \"prefetch-sync\" : \"sync\")\n\t\t\t\t\tconst syncPromise = this.settings.initData?.prefetchSyncPromise ?? this.fetchTreeSync()\n\t\t\t\t\tif (this.settings.initData) {\n\t\t\t\t\t\tdelete this.settings.initData.prefetchSyncPromise\n\t\t\t\t\t}\n\t\t\t\t\tvoid syncPromise\n\t\t\t\t\t\t.then(res => res.duration)\n\t\t\t\t\t\t.then(time => markLoadingPerf(\"dataLoad\", time))\n\t\t\t\t\t\t.catch(() => {})\n\t\t\t\t\tconst cachedState = await localCache.syncCrdtData(syncPromise)\n\t\t\t\t\tif (cachedState && cachedState.version >= this.treeVersion) {\n\t\t\t\t\t\tthis.loadingDuration = performance.now() - start\n\t\t\t\t\t\tmarkLoadingPerf(\"documentBytesReady\")\n\t\t\t\t\t\tsetLoadingInfo({\n\t\t\t\t\t\t\tformat: \"crdt\",\n\t\t\t\t\t\t\tstrategy: cachedState.syncStrategy,\n\t\t\t\t\t\t\tsources,\n\t\t\t\t\t\t\tsnapshotBytes: cachedState.snapshot.byteLength,\n\t\t\t\t\t\t\tsnapshotSource: cachedState.snapshotSource,\n\t\t\t\t\t\t\tcacheBackend: cachedState.cacheBackend,\n\t\t\t\t\t\t\tcachedRows: cachedState.cachedRows,\n\t\t\t\t\t\t\tcachedRowBytes: cachedState.cachedRowBytes,\n\t\t\t\t\t\t\tdownloadedRows: cachedState.downloadedRows,\n\t\t\t\t\t\t\tdownloadedRowBytes: cachedState.downloadedRowBytes,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tawait this.scheduler.yield()\n\t\t\t\t\t\tconst done = await this.createTreeFromCachedState(cachedState, cachedState.hierarchyHash)\n\t\t\t\t\t\tif (done) return\n\n\t\t\t\t\t\tlog.warn(\"local cache failed to create tree, falling back to full document load\")\n\t\t\t\t\t} else if (cachedState) {\n\t\t\t\t\t\tlog.warn(\"local cache behind websocket init tree version, falling back to full document load\")\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlog.warn(\"local cache failed, falling back to full document load\")\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tlog.warn(\"tree/sync failed, falling back to full document load:\", e)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst data = await this.loadCrdtData(sources)\n\n\t\t\tthis.loadingDuration = performance.now() - start\n\t\t\tmarkLoadingPerf(\"documentBytesReady\")\n\t\t\tsetLoadingInfo({\n\t\t\t\tformat: \"crdt\",\n\t\t\t\tstrategy: \"full-load\",\n\t\t\t\tsources,\n\t\t\t\tsnapshotBytes: data.byteLength,\n\t\t\t\tsnapshotSource: \"downloaded\",\n\t\t\t\tcachedRows: 0,\n\t\t\t\tcachedRowBytes: 0,\n\t\t\t\tdownloadedRows: 0,\n\t\t\t\tdownloadedRowBytes: 0,\n\t\t\t})\n\t\t\tawait this.scheduler.yield()\n\n\t\t\tawait this.createTreeFromBuffer(data)\n\t\t})\n\t}\n\n\tstartFromStore(): CanvasTree {\n\t\tconst meta = this.store.getObject<{ rootId: string; version: number }>(\"meta\")\n\t\tif (!meta) throw Error(\"Meta field not found\")\n\n\t\tthis.tree = this.loadFirstCrdtTreeFromStore(meta)\n\t\tthis.pauseLoadingScopes()\n\t\tthis.scheduler\n\t\t\t.run(async () => {\n\t\t\t\tawait this.loadAllScopesAsync()\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tif (this.scheduler.isCancelled()) return\n\t\t\t\tthis.emit(\"error\", error)\n\t\t\t})\n\t\treturn this.tree\n\t}\n\n\tprivate async fetchTreeSync(): PrefetchSyncPromise {\n\t\tconst localCache = this.settings.localCache\n\t\tassert(localCache, \"fetchTreeSync requires localCache\")\n\t\tconst treeVersion = localCache.getCachedTreeVersion()\n\n\t\tconst syncURL = this.settings.initData?.syncURL\n\t\t// TODO: Remove once we\u2019ve fully migrated to FramerMultiplayerService / always inject the `syncURL`\n\t\tconst url = syncURL\n\t\t\t? new URL(syncURL)\n\t\t\t: new URL(`/projects/${localCache.projectId}/tree/sync`, window.location.href)\n\t\turl.searchParams.set(\"version\", treeVersion.toString())\n\n\t\t// If we are replacing the prefetch promise, we want to track the duration from start of\n\t\t// page until the response. Otherwise we measure the duration of the fetch.\n\t\tlet fetchStart = performance.now()\n\t\tif (perfEmitter && !perfEmitter.isComplete()) {\n\t\t\tfetchStart = loadingStartTime\n\t\t}\n\n\t\tlet authorizationHeader: RequestInit | undefined = undefined\n\t\tif (this.settings.refreshAccessToken) {\n\t\t\tauthorizationHeader = await this.settings.refreshAccessToken({})\n\t\t}\n\n\t\tconst response = await fetch(url, authorizationHeader)\n\t\tconst strategy = \"Sync-Strategy\"\n\t\treturn {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t\tduration: Promise.resolve(performance.now() - fetchStart),\n\t\t\tupdates: response.headers.get(strategy) === \"incremental\" ? response.json() : undefined,\n\t\t\tsnapshot: response.headers.get(strategy) === \"snapshot\" ? response.arrayBuffer() : undefined,\n\t\t}\n\t}\n\n\tprotected async loadCrdtData(sources: LoadingSource[] = []): Promise<Uint8Array> {\n\t\tif (this.settings.loadedData && this.settings.loadedData instanceof Uint8Array) {\n\t\t\tlog.debug(\"loadData: loadedData\")\n\t\t\tsources.push(\"loaded-data\")\n\t\t\treturn this.settings.loadedData\n\t\t}\n\n\t\tconst initData = this.settings.initData\n\n\t\tlog.debug(\"loadData: prefetch\")\n\t\tif (initData?.prefetchPromise) {\n\t\t\tconst prefetchPromise = initData.prefetchPromise\n\t\t\tdelete initData.prefetchPromise\n\n\t\t\tif (initData.version === this.treeVersion) {\n\t\t\t\tsources.push(\"prefetch-tree\")\n\t\t\t\tconst prefetchResponse = await prefetchPromise\n\t\t\t\tvoid prefetchResponse.duration.then(time => markLoadingPerf(\"dataLoad\", time)).catch(() => {})\n\n\t\t\t\tif (prefetchResponse.status < 200 || prefetchResponse.status >= 300) {\n\t\t\t\t\tthrow new Error(`Failed to fetch project data. Status code: ${prefetchResponse.status}`)\n\t\t\t\t}\n\n\t\t\t\tif (prefetchResponse.buffer) {\n\t\t\t\t\tlog.debug(\"loadData: prefetch bytes parser\")\n\t\t\t\t\tconst arrayBuffer = await prefetchResponse.buffer\n\t\t\t\t\tawait this.scheduler.yield()\n\t\t\t\t\treturn new Uint8Array(arrayBuffer)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Special case: if we have a prefetchSyncPromise, but no local cache, if the sync resulted\n\t\t// in a snapshot, we can and should still use it. This happens when the local cache\n\t\t// experiment is off.\n\t\tif (initData?.prefetchSyncPromise) {\n\t\t\tconst prefetchSyncPromise = initData.prefetchSyncPromise\n\t\t\tdelete initData.prefetchSyncPromise\n\n\t\t\tconst prefetchResponse = await prefetchSyncPromise\n\t\t\tconst version = Number(prefetchResponse.headers.get(\"Tree-Version\"))\n\t\t\tif (version === this.treeVersion) {\n\t\t\t\tvoid prefetchResponse.duration.then(time => markLoadingPerf(\"dataLoad\", time)).catch(() => {})\n\n\t\t\t\tif (prefetchResponse.status < 200 || prefetchResponse.status >= 300) {\n\t\t\t\t\tthrow new Error(`Failed to fetch project data. Status code: ${prefetchResponse.status}`)\n\t\t\t\t}\n\n\t\t\t\tif (prefetchResponse.snapshot) {\n\t\t\t\t\tsources.push(\"prefetch-sync\")\n\t\t\t\t\tlog.debug(\"loadData: prefetch sync snapshot\")\n\t\t\t\t\tconst arrayBuffer = await prefetchResponse.snapshot\n\t\t\t\t\tawait this.scheduler.yield()\n\t\t\t\t\treturn new Uint8Array(arrayBuffer)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsources.push(\"tree-download\")\n\t\tlog.debug(\"loadData: fetch\")\n\t\tlet authorizationHeader: RequestInit | undefined = undefined\n\t\tif (this.settings.refreshAccessToken) {\n\t\t\tauthorizationHeader = await this.settings.refreshAccessToken({})\n\t\t\tawait this.scheduler.yield()\n\t\t}\n\n\t\tfor (let attempt = 0; attempt < MAX_RETRIES; ++attempt) {\n\t\t\tconst response = await fetch(this.documentURL, authorizationHeader)\n\n\t\t\tif (response.ok) {\n\t\t\t\tawait this.scheduler.yield()\n\t\t\t\tconst buffer = await response.arrayBuffer()\n\t\t\t\tawait this.scheduler.yield()\n\n\t\t\t\treturn new Uint8Array(buffer)\n\t\t\t}\n\n\t\t\tif (response.status < 200 || response.status >= 300) {\n\t\t\t\tlog.debug(\"onErrorStatusLoaded, retry:\", attempt)\n\t\t\t\tawait this.scheduler.sleep(attempt * RETRY_BACKOFF_MS + Math.random() * RETRY_BACKOFF_MS)\n\t\t\t}\n\t\t}\n\n\t\tthrow Error(`Failed to fetch project data after attempting ${MAX_RETRIES} times`)\n\t}\n\n\tprotected override createLoadingScope(id: string): LoadingScopeInterface {\n\t\treturn new LoadingCrdtScope(id, this.store)\n\t}\n\n\t/**\n\t * Rebuild a fresh tree from the CRDT store for crash recovery.\n\t * Resets internal loader state and builds a new tree with the given scope fully loaded.\n\t * The returned tree has this loader installed as its service so background scope loading\n\t * continues normally.\n\t */\n\tresetForCrashRecovery(activeScopeId: string): CanvasTree {\n\t\tconst errors: string[] = []\n\t\tconst DEPTH_TO_ROOT_CHILDREN = 1\n\n\t\tconst meta = this.store.getObject<{ rootId: string; version: number }>(\"meta\")\n\t\tif (!meta) throw Error(\"Meta field not found in CRDT store during crash recovery\")\n\n\t\tconst rawRoot = this.store.getObjectWithShallowChildren<ValueNode>(meta.rootId, DEPTH_TO_ROOT_CHILDREN)\n\t\tconst root = canvasNodeFromValue(rawRoot, null, {\n\t\t\textraChecksAndFixes: true,\n\t\t\terrors,\n\t\t\twarnings: errors,\n\t\t}) as RootNode | undefined\n\t\tif (!root) throw Error(\"Unable to create root from store during crash recovery\")\n\n\t\tfor (const child of root.children) {\n\t\t\tchild.cache.isShallowLoad = true\n\t\t}\n\n\t\t// Reset internal loader state\n\t\tthis.parsedIds = new Set()\n\t\tthis.scopesToLoad = new Set()\n\t\tthis.currentLoadingScope = undefined\n\t\tthis.addedByDiff = new Set()\n\t\tthis.removedByDiff = new Set()\n\t\tthis.loadCallbacksPerScope = new Map()\n\t\tthis.activelyLoadingScope = false\n\n\t\tconst pagesToLoad = [...pagesToAlwaysLoad]\n\t\tif (activeScopeId) {\n\t\t\tpagesToLoad.push(activeScopeId)\n\t\t}\n\n\t\tfor (const scopeId of pagesToLoad) {\n\t\t\tconst rawPage = this.store.getObject<ValueNode>(scopeId)\n\t\t\tif (!rawPage) continue\n\t\t\tconst pageNode = canvasNodeFromValue(rawPage)\n\t\t\tif (!pageNode) continue\n\n\t\t\tpageNode.cache.isShallowLoad = false\n\t\t\tconst scopeIndex = root.children.findIndex(scope => scope.id === scopeId)\n\t\t\tif (scopeIndex >= 0) {\n\t\t\t\troot.children.splice(scopeIndex, 1, pageNode)\n\t\t\t}\n\t\t\tthis.parsedIds.add(scopeId)\n\t\t}\n\n\t\trepairRootNode(root, errors)\n\n\t\tfor (const child of root.children) {\n\t\t\tif (this.parsedIds.has(child.id)) continue\n\t\t\tthis.scopesToLoad.add(child.id)\n\t\t}\n\n\t\tlet tree = CanvasTree.createByAdoptingRoot(root, { mode: \"crdt\" })\n\t\ttree.verify()\n\t\ttree = TemplateHelper.treeDidLoad(tree, this.componentLoader, []).didNonLinearMove(this.componentLoader)\n\t\tconst cycles: DetectedCycles = []\n\t\tif (checkTreeForCycles(tree, cycles)) {\n\t\t\tcycles.forEach(cycle => {\n\t\t\t\terrors.push(`${cycle.id}: code component links itself via ${cycle.stack}`)\n\t\t\t\trepairCycleInNode(tree, cycle.id, cycle.stack)\n\t\t\t})\n\t\t\ttree = tree.commit(this.componentLoader)\n\t\t}\n\n\t\tif (errors.length > 0) {\n\t\t\tlog.warn(\"[crash-recovery] errors rebuilding tree from store:\", errors.join(\"\\n\"))\n\t\t}\n\n\t\ttree.setService(\"loader\", this)\n\t\tthis.tree = tree\n\t\tthis.loadedFirstScope = true\n\n\t\treturn tree\n\t}\n}\n"],
  "mappings": "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",
  "names": ["log", "log", "EventEmitter", "isNumber", "start", "loadedScope", "log"]
}
