@cloudpdf/engine 3.0.0-next.14 → 3.0.0-next.15
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/dist/index.cjs +2304 -1091
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +524 -249
- package/dist/index.d.ts +524 -249
- package/dist/index.js +2430 -1200
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["AbortablePromise","EngineError","EngineErrorCode","wirePaths","DocumentActionsSnapshotSchema","AbortablePromise","EngineError","EngineErrorCode","wirePaths","AnnotationListSnapshotAllPagesSchema","AnnotationListPageSnapshotSchema","WeakAnnotationSessionResponseSchema","EngineError","EngineErrorCode","EmbeddedFileItemSchema","AbortablePromise","EngineError","EngineErrorCode","wirePaths","AttachmentCreateResultSchema","AttachmentDeleteResultSchema","AbortablePromise","wirePaths","FormSnapshotSchema","FormFieldDTOSchema","FormSetValueResultSchema","FormEffectsResultSchema","FormImportResultSchema","FormFieldCreateResultSchema","FormFieldUpdateResultSchema","FormFieldDeleteResultSchema","FormWidgetLinkResultSchema","FormRepairResultSchema","EngineError","EngineErrorCode","AbortablePromise","EngineError","EngineErrorCode","wirePaths","PageListSnapshotSchema","PageMoveResultSchema","PageNameResultSchema","PageRotateResultSchema","PageDeleteResultSchema","PageInsertResultSchema","PageFlattenResultSchema","AbortablePromise","EngineError","EngineErrorCode","wirePaths","RedactionApplyResultSchema","AbortablePromise","EngineError","EngineErrorCode","wirePaths","SearchSliceSchema","EngineError","EngineErrorCode","AbortablePromise","EngineError","EngineErrorCode","wirePaths","AccessResponseSchema","AbortablePromise","wirePaths","SignatureSnapshotSchema","ChangeAnalysisSchema","SignaturePreparedWireSchema","SignatureCompleteResultSchema","SignatureAbortResultSchema","EngineError","EngineErrorCode","AbortablePromise","EngineError","EngineErrorCode","wirePaths","DocumentMetadataSchema","MetadataUpdateResultSchema","AbortablePromise","EngineError","EngineErrorCode","wirePaths","AnnotationListPageSnapshotSchema","AnnotationCreateResultSchema","AnnotationUpdateResultSchema","AnnotationDeleteResultSchema","AnnotationMoveResultSchema","AnnotationFlattenResultSchema","AnnotationAppearanceManifestSchema","AbortablePromise","EngineError","EngineErrorCode","wirePaths","PageGeometrySnapshotSchema","AbortablePromise","EngineError","EngineErrorCode","wirePaths","AbortablePromise","EngineError","EngineErrorCode","wirePaths","PageTextSnapshotSchema","AbortablePromise","wirePaths","PageMeasurementViewportSchema","PageScaleResultSchema","EngineError","EngineErrorCode","EngineError","EngineErrorCode","DEFAULT_LAYER_NAME","CONTINUOUS_RENDER_POLICY","EventHub","SessionEventPublisher","AbortablePromise","EngineError","EngineErrorCode","DEFAULT_PDF_SAVE_MODE","wirePaths","DocumentHeadSchema","DocumentManifestSchema","AbortError","EngineError","EngineErrorCode","EngineError","EngineErrorCode","AbortError","EngineErrorPayloadSchema","AbortablePromise","EngineError","EngineErrorCode","DEFAULT_LAYER_NAME","wirePaths","DocumentHeadSchema"],"sources":["../src/document/planes.ts","../src/document/CloudDocumentActionsService.ts","../src/document/CloudDocumentAnnotationsService.ts","../src/document/buildMutationForm.ts","../src/document/parseAttachmentContent.ts","../src/document/CloudDocumentAttachmentsService.ts","../src/document/CloudDocumentFormsService.ts","../src/document/CloudDocumentPagesService.ts","../src/document/CloudDocumentRedactionService.ts","../src/document/CloudDocumentSearchService.ts","../src/transport/decodeUnverifiedClaims.ts","../src/document/CloudDocumentSecurityService.ts","../src/document/CloudDocumentSignaturesService.ts","../src/document/CloudMetadataService.ts","../src/document/CloudPageAnnotationsService.ts","../src/document/CloudPageGeometryService.ts","../src/document/CloudPageRenderService.ts","../src/document/CloudPageTextService.ts","../src/document/CloudPageMeasureService.ts","../src/document/CloudPageHandle.ts","../src/realtime/auditRowToEvent.ts","../src/realtime/SseClient.ts","../src/document/CloudDocumentHandle.ts","../src/share.ts","../src/transport/HttpClient.ts","../src/CloudEngine.ts","../src/index.ts"],"sourcesContent":["import type { DocumentManifest, LayerScopePlane } from '@embedpdf/engine-core/wire';\n\n/**\n * Plane-scope resolution — THE one rule every cloud service uses to pick a\n * path family: a read resolves at the DOC-LEVEL (shared base) path iff EVERY\n * plane it depends on is inherited (`'base'`) by this layer. One owned plane\n * → the layer-scoped path.\n *\n * Absent `scopes` (base manifests never carry it; pre-plane servers omit\n * it) means layer paths — never wrong, only unshared.\n */\nexport function planesInherited(\n manifest: DocumentManifest,\n planes: readonly LayerScopePlane[],\n): boolean {\n const scopes = manifest.scopes;\n if (!scopes) return false;\n return planes.every((plane) => scopes[plane] === 'base');\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type DocumentActionsService,\n type DocumentActionsSnapshot,\n} from '@embedpdf/engine-core/runtime';\nimport { DocumentActionsSnapshotSchema, wirePaths } from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { planesInherited } from './planes';\nimport type { HttpClient } from '../transport/HttpClient';\n\nexport class CloudDocumentActionsService implements DocumentActionsService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n ) {}\n\n read(): AbortablePromise<DocumentActionsSnapshot> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run((signal) =>\n this.http.getJsonWithRefresh(\n async (currentSignal) => {\n const manifest = await this.manifest.get(currentSignal);\n // Plane-scope rule: catalog actions depend on the `actions` plane\n // (constant-inherited until action writing exists) — one\n // doc-level URL, base session, no layer warm-up on open.\n return planesInherited(manifest, ['actions'])\n ? wirePaths.docActions(this.docId, manifest.actionsVersion)\n : wirePaths.layerActions(this.docId, this.layerName, manifest.actionsVersion);\n },\n (raw) => DocumentActionsSnapshotSchema.parse(raw),\n async (currentSignal) => {\n await this.manifest.refresh(currentSignal);\n },\n signal,\n ),\n );\n }\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type AnnotationListPageSnapshot,\n type AnnotationListSnapshotAllPages,\n type DocumentAnnotationsService,\n type DocumentManifest,\n type ManifestPage,\n type PageObjectNumber,\n type WeakAnnotationEditSession,\n} from '@embedpdf/engine-core/runtime';\nimport {\n AnnotationListPageSnapshotSchema,\n AnnotationListSnapshotAllPagesSchema,\n WeakAnnotationSessionResponseSchema,\n wirePaths,\n type WeakAnnotationSessionResponse,\n} from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { planesInherited } from './planes';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/** Bulk-read restarts after a mid-flight mutation staled the pinned\n * version (404 on the immutable leaf → refresh the manifest → retry). */\nconst MAX_COHERENCE_RESTARTS = 2;\n\nexport class CloudDocumentAnnotationsService implements DocumentAnnotationsService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n ) {}\n\n /**\n * One COHERENT whole-document snapshot: a single read of the immutable\n * `annotations/items@annotationsVersion=N` leaf at the manifest's pin —\n * materialized server-side by one raw (no page-load) sweep, CDN-cacheable\n * because the pin bumps only when annotation list bodies actually change.\n * A stale pin mid-read (a concurrent mutation → 404) refreshes the\n * manifest and retries, so the result always belongs to one document\n * moment (the torn read this method exists to prevent).\n */\n listRawAll(): AbortablePromise<AnnotationListSnapshotAllPages> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AnnotationListSnapshotAllPages>(async (signal) => {\n for (let attempt = 0; ; attempt++) {\n const manifest =\n attempt === 0 ? await this.manifest.get(signal) : await this.manifest.refresh(signal);\n try {\n return await this.readBulkAt(manifest, signal);\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound) || attempt >= MAX_COHERENCE_RESTARTS) {\n throw err;\n }\n // The pin staled under us; retry against the fresh manifest.\n }\n }\n });\n }\n\n /** One bulk leaf read at the manifest's pin. The server stamps the body's\n * `auditHead` at materialization time; a CDN-cached body may carry a\n * cursor older than the current manifest's, which is still safe — the\n * pin proves no items-affecting mutation landed in between, so replaying\n * that window over the body is all no-ops. */\n private async readBulkAt(\n manifest: DocumentManifest,\n signal: AbortSignal,\n ): Promise<AnnotationListSnapshotAllPages> {\n const path = planesInherited(manifest, ['annotations'])\n ? wirePaths.docAnnotationsAll(this.docId, manifest.annotationsVersion)\n : wirePaths.layerAnnotationsAll(this.docId, this.layerName, manifest.annotationsVersion);\n const body = await this.http.getJson(\n path,\n (raw) => AnnotationListSnapshotAllPagesSchema.parse(raw),\n signal,\n );\n return { ...body, auditHead: body.auditHead ?? manifest.auditHead };\n }\n\n listRaw(pageObjectNumber: PageObjectNumber): AbortablePromise<AnnotationListPageSnapshot> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n // Same versioned, CDN-cacheable read as `page.annotations.list()`,\n // with the standard stale-pin retry (404 → refresh manifest → once).\n return AbortablePromise.run<AnnotationListPageSnapshot>((signal) =>\n this.http.getJsonWithRefresh(\n async (s) => this.versionedPagePath(await this.manifest.get(s), pageObjectNumber),\n (raw) => AnnotationListPageSnapshotSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n ),\n );\n }\n\n /** Versioned leaf URL for one manifest page entry, with the same\n * plane routing as `CloudPageAnnotationsService.list()`: an inherited\n * `annotations` plane reads the doc-level base leaf. */\n private pagePathAt(manifest: DocumentManifest, page: ManifestPage): string {\n return planesInherited(manifest, ['annotations'])\n ? wirePaths.docPageAnnotations(\n this.docId,\n page.state.pageObjectNumber,\n page.cache.annotationVersion,\n )\n : wirePaths.layerPageAnnotations(\n this.docId,\n this.layerName,\n page.state.pageObjectNumber,\n page.cache.annotationVersion,\n );\n }\n\n private versionedPagePath(\n manifest: DocumentManifest,\n pageObjectNumber: PageObjectNumber,\n ): string {\n const page = manifest.pages.find((p) => p.state.pageObjectNumber === pageObjectNumber);\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${pageObjectNumber} in document ${this.docId}`,\n );\n }\n return this.pagePathAt(manifest, page);\n }\n\n beginWeakEdit(\n pageObjectNumbers: readonly PageObjectNumber[],\n ): AbortablePromise<WeakAnnotationEditSession> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<WeakAnnotationEditSession>(async (signal) => {\n const response = await this.http.postJson(\n wirePaths.layerWeakAnnotationSession(this.docId, this.layerName),\n { pageObjectNumbers },\n (raw) => WeakAnnotationSessionResponseSchema.parse(raw),\n signal,\n );\n return new CloudWeakAnnotationEditSession(\n this.http,\n this.docId,\n this.layerName,\n () => this.isClosed(),\n response,\n );\n });\n }\n\n}\n\nclass CloudWeakAnnotationEditSession implements WeakAnnotationEditSession {\n private response: WeakAnnotationSessionResponse;\n private released = false;\n\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n response: WeakAnnotationSessionResponse,\n ) {\n this.response = response;\n }\n\n get id(): string {\n return this.response.sessionId;\n }\n\n get expiresAt(): number {\n return this.response.expiresAt;\n }\n\n get heartbeatIntervalMs(): number {\n return this.response.heartbeatIntervalMs;\n }\n\n get pageObjectNumbers(): readonly PageObjectNumber[] {\n return this.response.pageObjectNumbers;\n }\n\n covers(pageObjectNumber: PageObjectNumber): boolean {\n return this.response.pageObjectNumbers.includes(pageObjectNumber);\n }\n\n updatePages(pageObjectNumbers: readonly PageObjectNumber[]): AbortablePromise<void> {\n if (this.isClosed() || this.released) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `weak annotation session ${this.id} is closed`),\n );\n }\n return AbortablePromise.run<void>(async (signal) => {\n this.response = await this.http.postJson(\n wirePaths.layerWeakAnnotationSessionPages(this.docId, this.layerName, this.id),\n { pageObjectNumbers },\n (raw) => WeakAnnotationSessionResponseSchema.parse(raw),\n signal,\n );\n });\n }\n\n heartbeat(): AbortablePromise<void> {\n if (this.isClosed() || this.released) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `weak annotation session ${this.id} is closed`),\n );\n }\n return AbortablePromise.run<void>(async (signal) => {\n this.response = await this.http.postJson(\n wirePaths.layerWeakAnnotationSessionHeartbeat(this.docId, this.layerName, this.id),\n {},\n (raw) => WeakAnnotationSessionResponseSchema.parse(raw),\n signal,\n );\n });\n }\n\n release(): AbortablePromise<void> {\n if (this.released) {\n return AbortablePromise.resolveValue(undefined);\n }\n this.released = true;\n return AbortablePromise.run<void>((signal) =>\n this.http.deleteEmpty(\n wirePaths.layerWeakAnnotationSessionRelease(this.docId, this.layerName, this.id),\n signal,\n ),\n );\n }\n}\n","import type { WireResourceMap } from '@embedpdf/engine-core/runtime';\n\n/**\n * Multipart envelope for mutations that carry binaries: part `body` holds\n * the exact JSON the plain request would have been, plus one\n * `resource:{key}` file part per binary payload. Mirrors the appearance\n * response protocol (`manifest` part + named image parts) in reverse.\n * Shared by the annotation mutations (stamp images, attachment files) and\n * the document-level `attachments.create` — one envelope, one parser on\n * the server side.\n */\nexport function buildMutationForm(body: unknown, resources: WireResourceMap): FormData {\n const form = new FormData();\n form.append('body', JSON.stringify(body));\n for (const [key, resource] of Object.entries(resources)) {\n form.append(\n `resource:${key}`,\n new Blob([resource.bytes], { type: resource.mimeType ?? 'application/octet-stream' }),\n resource.name ?? key,\n );\n }\n return form;\n}\n\nexport function hasResources(resources: WireResourceMap): boolean {\n return Object.keys(resources).length > 0;\n}\n","import {\n EngineError,\n EngineErrorCode,\n type AttachmentContent,\n} from '@embedpdf/engine-core/runtime';\nimport { decodeTokenText } from '@embedpdf/engine-core/wire';\n\nimport type { HttpFileResponse } from '../transport/HttpClient';\n\n/** Header carrying the file's name, token-text encoded (names are\n * arbitrary UTF-8; HTTP header values are not). */\nconst FILE_NAME_HEADER = 'X-EmbedPDF-File-Name';\n\n/**\n * Project an attachment-file response into `AttachmentContent`. The body\n * IS the decoded bytes; the metadata rides as headers — `Content-Type`\n * for the declared mime type, `X-EmbedPDF-File-Name` for the file name.\n * Shared by the document-level `attachments.download()` and the\n * annotation-level `annotations.downloadFile()` reads — one wire shape\n * for both homes a file can live in.\n */\nexport function parseAttachmentContent(file: HttpFileResponse): AttachmentContent {\n const encodedName = file.headers.get(FILE_NAME_HEADER);\n if (encodedName === null) {\n throw new EngineError(\n EngineErrorCode.WireFormat,\n `attachment response missing ${FILE_NAME_HEADER} header`,\n );\n }\n let name: string;\n try {\n name = decodeTokenText(encodedName);\n } catch (err) {\n throw new EngineError(\n EngineErrorCode.WireFormat,\n `malformed ${FILE_NAME_HEADER} header: ${(err as Error)?.message ?? err}`,\n { cause: err },\n );\n }\n const mimeType = file.headers.get('Content-Type');\n return {\n bytes: file.bytes,\n name,\n ...(mimeType !== null ? { mimeType } : {}),\n };\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n normalizeAttachmentFileSource,\n type AttachmentContent,\n type AttachmentCreateResult,\n type AttachmentDeleteResult,\n type AttachmentFileSource,\n type DocumentAttachmentsService,\n type EmbeddedFileItem,\n type EmbeddedFileRef,\n} from '@embedpdf/engine-core/runtime';\nimport {\n AttachmentCreateResultSchema,\n AttachmentDeleteResultSchema,\n EmbeddedFileItemSchema,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\nimport type { SessionEventPublisher } from '@embedpdf/engine-services';\n\nimport { buildMutationForm } from './buildMutationForm';\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { planesInherited } from './planes';\nimport { parseAttachmentContent } from './parseAttachmentContent';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/** The `/attachments@…` listing leaf is a bare array of name-tree entries. */\nconst EmbeddedFileListSchema = EmbeddedFileItemSchema.array();\n\n/**\n * Cloud-side document-level attachments (the catalog's `/EmbeddedFiles`\n * name tree). Reads use immutable leaves pinned by the manifest's\n * `attachmentsVersion`: `/attachments@…` for the metadata listing and\n * `/attachment-files/…@…` for one file's decoded bytes — a separate\n * capability tier, so a CDN credential for the listing can never egress\n * content. Mutations use unversioned collection/member URLs and are\n * never cached.\n */\nexport class CloudDocumentAttachmentsService implements DocumentAttachmentsService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n ) {}\n\n /**\n * Snapshot of the name tree, in tree (key-sorted) order. Pulls\n * `attachmentsVersion` from the cached manifest and, on a 404 (stale\n * pointer), transparently refreshes the manifest and retries once.\n * The pin bumps only on attachment writes, so this leaf stays cached\n * across page and annotation edits.\n */\n list(): AbortablePromise<EmbeddedFileItem[]> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<EmbeddedFileItem[]>(async (signal) => {\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n // Plane-scope rule: the listing depends on the `attachments` plane —\n // while inherited, one CDN object serves every visitor's sidebar\n // from the base worker session.\n return planesInherited(manifest, ['attachments'])\n ? wirePaths.docAttachments(this.docId, manifest.attachmentsVersion)\n : wirePaths.layerAttachments(this.docId, this.layerName, manifest.attachmentsVersion);\n };\n return this.http.getJsonWithRefresh(\n buildPath,\n (raw) => EmbeddedFileListSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n });\n }\n\n /**\n * Decode and return one embedded file's bytes. The body is the decoded\n * stream; the name and mime type ride as response headers (see\n * `parseAttachmentContent`). Same versioned-leaf + refresh-retry rails\n * as {@link list}.\n */\n download(ref: EmbeddedFileRef): AbortablePromise<AttachmentContent> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AttachmentContent>(async (signal) => {\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n // Same plane switch as list(): the byte leaf shares too.\n return planesInherited(manifest, ['attachments'])\n ? wirePaths.docAttachmentFile(this.docId, ref.key, manifest.attachmentsVersion)\n : wirePaths.layerAttachmentFile(\n this.docId,\n this.layerName,\n ref.key,\n manifest.attachmentsVersion,\n );\n };\n const file = await this.http.getFileWithRefresh(\n buildPath,\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n return parseAttachmentContent(file);\n });\n }\n\n /**\n * Create an embedded file in the name tree. Same splitter the\n * file-attachment annotation draft uses — metadata into the `body`\n * JSON part, bytes into the `resource:r0` file part — POSTed as the\n * standard multipart mutation envelope.\n */\n create(file: AttachmentFileSource): AbortablePromise<AttachmentCreateResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AttachmentCreateResult>(async (signal) => {\n const { wireFile, resource } = await normalizeAttachmentFileSource(file, 'r0');\n const result = await this.http.postMultipartJson(\n wirePaths.layerAttachmentsCollection(this.docId, this.layerName),\n buildMutationForm(wireFile, { r0: resource }),\n (raw) => AttachmentCreateResultSchema.parse(raw),\n signal,\n );\n // Patch the cached manifest, then publish (in that order — listeners\n // reading the manifest in their callback must see post-mutation\n // state). An attachment write only advances docVersion +\n // attachmentsVersion (no per-page pin changes, no layoutVersion), so\n // the cached manifest is patched in place — no refetch.\n if (result.cache) this.manifest.applyAttachments(result.cache);\n this.publisher.publishLocal({ type: 'attachment.created', ...result });\n return result;\n });\n }\n\n /** Delete an embedded file from the name tree by its durable key. */\n delete(ref: EmbeddedFileRef): AbortablePromise<AttachmentDeleteResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AttachmentDeleteResult>(async (signal) => {\n const result = await this.http.deleteJson(\n wirePaths.layerAttachmentItem(this.docId, this.layerName, ref.key),\n (raw) => AttachmentDeleteResultSchema.parse(raw),\n signal,\n );\n // Same absorb-then-publish rails as create().\n if (result.cache) this.manifest.applyAttachments(result.cache);\n this.publisher.publishLocal({ type: 'attachment.deleted', ...result });\n return result;\n });\n }\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n encodeFieldRefKey,\n type DocumentEventInit,\n type DocumentFormsService,\n type FormDataExport,\n type FormDataFormat,\n type FormEffect,\n type FormEffectsResult,\n type FormFieldCreateResult,\n type FormFieldDeleteResult,\n type FormFieldDraft,\n type FormFieldDTO,\n type FormFieldPatch,\n type FormFieldRef,\n type FormFieldUpdateResult,\n type SignatureAppearanceInput,\n type FormFieldValue,\n type FormImportResult,\n type FormRepairOptions,\n type FormRepairResult,\n type FormSetValueResult,\n type FormSnapshot,\n type FormWidgetLinkResult,\n type FormWidgetRef,\n type MutationMeta,\n} from '@embedpdf/engine-core/runtime';\nimport {\n FormFieldCreateResultSchema,\n FormFieldDeleteResultSchema,\n FormFieldDTOSchema,\n FormFieldUpdateResultSchema,\n FormEffectsResultSchema,\n FormImportResultSchema,\n FormRepairResultSchema,\n FormSetValueResultSchema,\n FormSnapshotSchema,\n FormWidgetLinkResultSchema,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\nimport type { SessionEventPublisher } from '@embedpdf/engine-services';\n\nimport { buildMutationForm } from './buildMutationForm';\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/** Content types the import POST body may carry; the server sniffs the\n * actual format from the bytes, so this is advisory only. */\nconst IMPORT_CONTENT_TYPE: Record<FormDataFormat, string> = {\n fdf: 'application/vnd.fdf',\n xfdf: 'application/vnd.adobe.xfdf',\n};\n\n/**\n * Cloud-side document forms service. Mirrors the local wiring: each call\n * produces an `AbortablePromise` that propagates `signal.abort()` down to\n * `fetch` and validates the JSON response with the wire-stable Zod schema.\n *\n * Forms are document-scoped, so reads use the unversioned `/form` URLs\n * (always `no-store` — there is no content-addressed variant). Mutation\n * results carry the per-page `cacheDelta` for pages whose widget\n * appearances changed; `absorbMutation` folds it into the cached manifest\n * so annotation/render reads stay coherent.\n */\nexport class CloudDocumentFormsService implements DocumentFormsService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n ) {}\n\n list(): AbortablePromise<FormSnapshot> {\n const rejected = this.rejectIfClosed<FormSnapshot>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormSnapshot>((signal) =>\n this.http.getJson(\n wirePaths.layerForm(this.docId, this.layerName),\n (raw) => FormSnapshotSchema.parse(raw),\n signal,\n ),\n );\n }\n\n get(ref: FormFieldRef): AbortablePromise<FormFieldDTO> {\n const rejected = this.rejectIfClosed<FormFieldDTO>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormFieldDTO>((signal) =>\n this.http.getJson(\n wirePaths.layerFormFieldByKey(this.docId, this.layerName, encodeFieldRefKey(ref)),\n (raw) => FormFieldDTOSchema.parse(raw),\n signal,\n ),\n );\n }\n\n setValue(ref: FormFieldRef, value: FormFieldValue): AbortablePromise<FormSetValueResult> {\n const rejected = this.rejectIfClosed<FormSetValueResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormSetValueResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerFormFieldValue(this.docId, this.layerName, encodeFieldRefKey(ref)),\n { value },\n (raw) => FormSetValueResultSchema.parse(raw),\n signal,\n );\n return this.absorbMutation(result, 'form.valueChanged');\n });\n }\n\n reset(ref: FormFieldRef): AbortablePromise<FormSetValueResult> {\n const rejected = this.rejectIfClosed<FormSetValueResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormSetValueResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerFormFieldReset(this.docId, this.layerName, encodeFieldRefKey(ref)),\n {},\n (raw) => FormSetValueResultSchema.parse(raw),\n signal,\n );\n return this.absorbMutation(result, 'form.valueChanged');\n });\n }\n\n applyEffects(effects: FormEffect[]): AbortablePromise<FormEffectsResult> {\n const rejected = this.rejectIfClosed<FormEffectsResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormEffectsResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerFormEffects(this.docId, this.layerName),\n { effects },\n (raw) => FormEffectsResultSchema.parse(raw),\n signal,\n );\n // An all-no-op/all-preflight-rejected batch deliberately has no\n // artifact, cache advance, or event.\n if (result.meta === null) return result;\n this.manifest.apply(result.meta, ['annotations']);\n this.publisher.publishLocal({ type: 'form.effectsApplied', ...result });\n return result;\n });\n }\n\n exportData(format: FormDataFormat = 'xfdf'): AbortablePromise<FormDataExport> {\n const rejected = this.rejectIfClosed<FormDataExport>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormDataExport>(async (signal) => {\n const bytes = await this.http.getBytes(\n wirePaths.layerFormData(this.docId, this.layerName, format),\n signal,\n );\n return { format, bytes };\n });\n }\n\n importData(\n data: Uint8Array | ArrayBuffer,\n format?: FormDataFormat,\n ): AbortablePromise<FormImportResult> {\n const rejected = this.rejectIfClosed<FormImportResult>();\n if (rejected) return rejected;\n const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\n return AbortablePromise.run<FormImportResult>(async (signal) => {\n const result = await this.http.postBytesJson(\n wirePaths.layerFormData(this.docId, this.layerName, format),\n bytes,\n format ? IMPORT_CONTENT_TYPE[format] : 'application/octet-stream',\n (raw) => FormImportResultSchema.parse(raw),\n signal,\n );\n return this.absorbMutation(result, 'form.imported');\n });\n }\n\n createField(draft: FormFieldDraft): AbortablePromise<FormFieldCreateResult> {\n const rejected = this.rejectIfClosed<FormFieldCreateResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormFieldCreateResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerFormFields(this.docId, this.layerName),\n draft,\n (raw) => FormFieldCreateResultSchema.parse(raw),\n signal,\n );\n return this.absorbMutation(result, 'form.fieldCreated');\n });\n }\n\n updateField(ref: FormFieldRef, patch: FormFieldPatch): AbortablePromise<FormFieldUpdateResult> {\n const rejected = this.rejectIfClosed<FormFieldUpdateResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormFieldUpdateResult>(async (signal) => {\n const result = await this.http.patchJson(\n wirePaths.layerFormFieldByKey(this.docId, this.layerName, encodeFieldRefKey(ref)),\n patch,\n (raw) => FormFieldUpdateResultSchema.parse(raw),\n signal,\n );\n return this.absorbMutation(result, 'form.fieldUpdated');\n });\n }\n\n setSignatureAppearance(\n ref: FormFieldRef,\n appearance: SignatureAppearanceInput,\n ): AbortablePromise<FormFieldUpdateResult> {\n const rejected = this.rejectIfClosed<FormFieldUpdateResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormFieldUpdateResult>(async (signal) => {\n const bytes = new ArrayBuffer(appearance.pdf.byteLength);\n new Uint8Array(bytes).set(appearance.pdf);\n const form = buildMutationForm(\n { resource: 'r0', pageIndex: appearance.pageIndex ?? 0 },\n { r0: { bytes, mimeType: 'application/pdf', name: 'appearance.pdf' } },\n );\n const result = await this.http.postMultipartJson(\n wirePaths.layerFormFieldSignatureAppearance(this.docId, this.layerName, encodeFieldRefKey(ref)),\n form,\n (raw) => FormFieldUpdateResultSchema.parse(raw),\n signal,\n );\n return this.absorbMutation(result, 'form.fieldUpdated');\n });\n }\n\n deleteField(ref: FormFieldRef): AbortablePromise<FormFieldDeleteResult> {\n const rejected = this.rejectIfClosed<FormFieldDeleteResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormFieldDeleteResult>(async (signal) => {\n const result = await this.http.deleteJson(\n wirePaths.layerFormFieldByKey(this.docId, this.layerName, encodeFieldRefKey(ref)),\n (raw) => FormFieldDeleteResultSchema.parse(raw),\n signal,\n );\n return this.absorbMutation(result, 'form.fieldDeleted');\n });\n }\n\n attachWidget(\n ref: FormFieldRef,\n widget: FormWidgetRef,\n options?: { onState?: string },\n ): AbortablePromise<FormWidgetLinkResult> {\n const rejected = this.rejectIfClosed<FormWidgetLinkResult>();\n if (rejected) return rejected;\n const onState = options?.onState;\n return AbortablePromise.run<FormWidgetLinkResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerFormFieldWidgets(this.docId, this.layerName, encodeFieldRefKey(ref)),\n { widget, ...(onState ? { onState } : {}) },\n (raw) => FormWidgetLinkResultSchema.parse(raw),\n signal,\n );\n return this.absorbMutation(result, 'form.widgetAttached');\n });\n }\n\n detachWidget(ref: FormFieldRef, widget: FormWidgetRef): AbortablePromise<FormWidgetLinkResult> {\n const rejected = this.rejectIfClosed<FormWidgetLinkResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormWidgetLinkResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerFormFieldWidgetsDetach(this.docId, this.layerName, encodeFieldRefKey(ref)),\n { widget },\n (raw) => FormWidgetLinkResultSchema.parse(raw),\n signal,\n );\n return this.absorbMutation(result, 'form.widgetDetached');\n });\n }\n\n repair(options?: FormRepairOptions): AbortablePromise<FormRepairResult> {\n const rejected = this.rejectIfClosed<FormRepairResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormRepairResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerFormRepair(this.docId, this.layerName),\n { bakeAppearances: options?.bakeAppearances ?? false },\n (raw) => FormRepairResultSchema.parse(raw),\n signal,\n );\n return this.absorbMutation(result, 'form.repaired');\n });\n }\n\n private rejectIfClosed<T>(): AbortablePromise<T> | null {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return null;\n }\n\n /**\n * Patch the cached manifest, then publish the mutation to the document's\n * event stream (in that order — listeners reading the manifest in their\n * callback must see post-mutation state). Same rails as annotations.\n */\n private absorbMutation<T extends { meta: MutationMeta }>(\n result: T,\n type:\n | 'form.valueChanged'\n | 'form.imported'\n | 'form.repaired'\n | 'form.fieldCreated'\n | 'form.fieldUpdated'\n | 'form.fieldDeleted'\n | 'form.widgetAttached'\n | 'form.widgetDetached',\n ): T {\n this.manifest.apply(result.meta, ['annotations']);\n this.publisher.publishLocal({ type, ...result } as unknown as DocumentEventInit);\n return result;\n }\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type DocumentPagesService,\n type PageFlattenResult,\n type PageFlattenUsage,\n type PageDeleteResult,\n type PageInsertBlankSpec,\n type PageInsertResult,\n type PageListSnapshot,\n type PageMoveResult,\n type PageNameInput,\n type PageNameResult,\n type PageObjectNumber,\n type PageRemoveNameInput,\n type PageRotateResult,\n type PageRotation,\n} from '@embedpdf/engine-core/runtime';\nimport {\n PageDeleteResultSchema,\n PageFlattenResultSchema,\n PageInsertResultSchema,\n PageListSnapshotSchema,\n PageMoveResultSchema,\n PageNameResultSchema,\n PageRotateResultSchema,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\nimport type { SessionEventPublisher } from '@embedpdf/engine-services';\n\nimport { buildMutationForm } from './buildMutationForm';\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { planesInherited } from './planes';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/** Detach a Uint8Array view into a standalone ArrayBuffer (the resource-map\n * shape) without disturbing a larger buffer the caller still owns. */\nfunction copyToExactBuffer(view: Uint8Array): ArrayBuffer {\n const copy = new ArrayBuffer(view.byteLength);\n new Uint8Array(copy).set(view);\n return copy;\n}\n\n/**\n * Cloud-side document pages service. Mirrors `LocalDocumentPagesService`\n * over HTTP: GET /pages for `list`, POST /pages/move for the reorder.\n *\n * Page identity rule (locked with the user, do not change):\n * - Pages are addressed exclusively by their indirect\n * `pageObjectNumber`. The wire never sends a page index for a\n * mutation. This keeps multi-call client logic from having to\n * account for index drift between requests.\n * - Successful `move()` returns the new `layout` (order + geometry) plus\n * cloud coherence pins. The server does NOT bump per-page revisions on a\n * page move (page reorder is intentionally outside the weak-ref staleness\n * model), only `docVersion` + `layoutVersion`.\n */\nexport class CloudDocumentPagesService implements DocumentPagesService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n ) {}\n\n /**\n * Page-geometry list. The geometry bytes live at the content-addressed\n * `/layout@layoutVersion=N` leaf (not in the manifest); the manifest only\n * publishes the `layoutVersion` pointer. So `list()` reads `layoutVersion`\n * from the cached manifest, fetches the layout leaf, and on a 404 (stale\n * pointer) transparently refreshes the manifest and retries once — the\n * same ladder the per-page text/geometry reads use. `layoutVersion` bumps\n * only on structural page ops, so this leaf stays cached across content\n * and annotation edits.\n */\n list(): AbortablePromise<PageListSnapshot> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageListSnapshot>(async (signal) => {\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n // Plane-scope rule: the layout leaf depends on the `layout` plane —\n // while inherited (no move/rotate/insert/delete ever ran), every\n // visitor's page list is ONE doc-level URL served from the base\n // session; the SDK open sequence creates no layer session.\n return planesInherited(manifest, ['layout'])\n ? wirePaths.docLayout(this.docId, manifest.layoutVersion)\n : wirePaths.layerLayout(this.docId, this.layerName, manifest.layoutVersion);\n };\n return this.http.getJsonWithRefresh(\n buildPath,\n (raw) => PageListSnapshotSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n });\n }\n\n move(pageObjectNumbers: PageObjectNumber[], destIndex: number): AbortablePromise<PageMoveResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageMoveResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerPagesMove(this.docId, this.layerName),\n { pageObjectNumbers, destIndex },\n (raw) => PageMoveResultSchema.parse(raw),\n signal,\n );\n // A move only advances docVersion + layoutVersion (no per-page pin\n // changes), so the cached manifest can be patched in place — no refetch.\n if (result.cache) this.manifest.applyPageStructure(result.cache);\n // Publish AFTER absorb: listeners reading the manifest in their\n // callback must see post-mutation state.\n this.publisher.publishLocal({ type: 'pages.moved', pageObjectNumbers, destIndex, ...result });\n return result;\n });\n }\n\n setName(input: PageNameInput): AbortablePromise<PageNameResult> {\n return this.runNameMutation(\n wirePaths.layerPagesNames(this.docId, this.layerName),\n input,\n input.name,\n input.pageObjectNumber,\n );\n }\n\n removeName(input: PageRemoveNameInput): AbortablePromise<PageNameResult> {\n return this.runNameMutation(\n wirePaths.layerPagesNamesDelete(this.docId, this.layerName),\n input,\n input.name,\n null,\n );\n }\n\n /**\n * Named pages are LAYOUT: both verbs share the page-move patch exactly —\n * docVersion + layoutVersion advance, no per-page pin changes, so the\n * cached manifest is patched in place and the fresh layout is published.\n */\n private runNameMutation(\n path: string,\n body: PageNameInput | PageRemoveNameInput,\n name: string,\n pageObjectNumber: PageObjectNumber | null,\n ): AbortablePromise<PageNameResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageNameResult>(async (signal) => {\n const result = await this.http.postJson(\n path,\n body,\n (raw) => PageNameResultSchema.parse(raw),\n signal,\n );\n if (result.cache) this.manifest.applyPageStructure(result.cache);\n this.publisher.publishLocal({ type: 'pages.named', name, pageObjectNumber, ...result });\n return result;\n });\n }\n\n rotate(\n pageObjectNumbers: PageObjectNumber[],\n rotation: PageRotation,\n ): AbortablePromise<PageRotateResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageRotateResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerPagesRotate(this.docId, this.layerName),\n { pageObjectNumbers, rotation },\n (raw) => PageRotateResultSchema.parse(raw),\n signal,\n );\n // Rotation shares the move patch exactly: docVersion + layoutVersion\n // advance, every per-page pin (and its cached render) stays warm.\n if (result.cache) this.manifest.applyPageStructure(result.cache);\n this.publisher.publishLocal({\n type: 'pages.rotated',\n pageObjectNumbers,\n rotation,\n ...result,\n });\n return result;\n });\n }\n\n delete(pageObjectNumbers: PageObjectNumber[]): AbortablePromise<PageDeleteResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageDeleteResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerPagesDelete(this.docId, this.layerName),\n { pageObjectNumbers },\n (raw) => PageDeleteResultSchema.parse(raw),\n signal,\n );\n // The structural advance plus dropping the deleted pages' manifest\n // rows — a retired PON must not be buildable from the local cache.\n if (result.cache) this.manifest.applyPageDelete(result.cache, pageObjectNumbers);\n this.publisher.publishLocal({ type: 'pages.deleted', pageObjectNumbers, ...result });\n return result;\n });\n }\n\n insert(bytes: Uint8Array | ArrayBuffer, destIndex?: number): AbortablePromise<PageInsertResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageInsertResult>(async (signal) => {\n // The multipart mutation envelope: the JSON the plain request would\n // have been rides the `body` part; the source PDF is `resource:source`.\n const buffer = bytes instanceof ArrayBuffer ? bytes : copyToExactBuffer(bytes);\n const form = buildMutationForm(destIndex !== undefined ? { destIndex } : {}, {\n source: { bytes: buffer, mimeType: 'application/pdf', name: 'source.pdf' },\n });\n const result = await this.http.postMultipartJson(\n wirePaths.layerPagesInsert(this.docId, this.layerName),\n form,\n (raw) => PageInsertResultSchema.parse(raw),\n signal,\n );\n // Insert changes the page SET: the cached manifest has no rows for\n // the fresh PONs, so the absorb drops it for a lazy refetch (the\n // result already carries the full new layout — nothing waits).\n if (result.cache) this.manifest.applyPageInsert(result.cache);\n this.publisher.publishLocal({ type: 'pages.inserted', destIndex, ...result });\n return result;\n });\n }\n\n insertBlank(spec: PageInsertBlankSpec, destIndex?: number): AbortablePromise<PageInsertResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageInsertResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerPagesInsertBlank(this.docId, this.layerName),\n {\n size: spec.size,\n ...(spec.count !== undefined ? { count: spec.count } : {}),\n ...(destIndex !== undefined ? { destIndex } : {}),\n },\n (raw) => PageInsertResultSchema.parse(raw),\n signal,\n );\n if (result.cache) this.manifest.applyPageInsert(result.cache);\n this.publisher.publishLocal({ type: 'pages.inserted', destIndex, ...result });\n return result;\n });\n }\n\n extract(pageObjectNumbers: PageObjectNumber[]): AbortablePromise<Uint8Array> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n // A read (gated by doc.download server-side): no absorb, no event —\n // nothing about the document changed.\n return AbortablePromise.run<Uint8Array>(async (signal) =>\n this.http.postJsonBytes(\n wirePaths.layerPagesExtract(this.docId, this.layerName),\n { pageObjectNumbers },\n signal,\n ),\n );\n }\n\n flatten(\n pageObjectNumbers: PageObjectNumber[],\n usage: PageFlattenUsage = 'display',\n ): AbortablePromise<PageFlattenResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageFlattenResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerPagesFlatten(this.docId, this.layerName),\n { pageObjectNumbers, usage },\n (raw) => PageFlattenResultSchema.parse(raw),\n signal,\n );\n // Nothing flattened means no artifact and therefore no coherence bump.\n if (result.meta === null) return result;\n // Flatten bakes annotations into page content, so both planes flip.\n this.manifest.apply(result.meta, ['content', 'annotations']);\n this.publisher.publishLocal({\n type: 'pages.flattened',\n ...result,\n });\n return result;\n });\n }\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type DocumentRedactionService,\n type RedactionApplyResult,\n type RedactionApplyScope,\n} from '@embedpdf/engine-core/runtime';\nimport { RedactionApplyResultSchema, wirePaths } from '@embedpdf/engine-core/wire';\nimport type { SessionEventPublisher } from '@embedpdf/engine-services';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Cloud-side redaction apply. Mirrors `LocalDocumentRedactionService` over\n * HTTP (POST /redactions/apply); the server enforces the capability gate\n * (`doc.pages.modify` + `doc.annotate.modify` + `doc.redact`) and persists\n * the rewritten layer artifact. See `DocumentRedactionService` for the\n * two-stage model and the layer trust boundary — an apply rewrites THIS\n * LAYER's bytes; the immutable base keeps the original.\n */\nexport class CloudDocumentRedactionService implements DocumentRedactionService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n ) {}\n\n apply(scope: RedactionApplyScope): AbortablePromise<RedactionApplyResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<RedactionApplyResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerRedactionsApply(this.docId, this.layerName),\n { scope },\n (raw) => RedactionApplyResultSchema.parse(raw),\n signal,\n );\n // Nothing applied means no artifact and therefore no coherence bump.\n if (result.meta === null) return result;\n // Redaction-apply rewrites content and consumes the marks, so both\n // planes flip.\n this.manifest.apply(result.meta, ['content', 'annotations']);\n this.publisher.publishLocal({\n type: 'redaction.applied',\n ...result,\n });\n return result;\n });\n }\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n canonicalSearchQuery,\n searchContentEpoch,\n type DocumentSearchService,\n type SearchQuery,\n type SearchRequest,\n type SearchSlice,\n} from '@embedpdf/engine-core/runtime';\nimport {\n SearchSliceSchema,\n decodeSearchToken,\n encodeSearchToken,\n wirePaths,\n type SearchToken,\n} from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Cloud search transport: versioned GETs, one per budgeted slice.\n *\n * Every slice URL is a canonical cache key — the search token pins the\n * layer's content epoch (computed from the cached manifest), the\n * CANONICAL query (default-fold literals collapse case/diacritic\n * variants into one entry), and the resume position. Identical searches\n * from any reader of the document hit the same CDN entry; matches are\n * all that ever crosses the trust boundary, and the rects/full endpoint\n * split keeps permission tiers in disjoint cache namespaces.\n *\n * Staleness rides the standard versioned-read signal: a first slice\n * answered `NotFound` means OUR manifest is stale → refresh and retry\n * once; a continuation answered `NotFound` means the document changed\n * mid-search → `InvalidArg`, same contract as the local engine's cursor.\n */\nexport class CloudDocumentSearchService implements DocumentSearchService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n ) {}\n\n query(request: SearchRequest): AbortablePromise<SearchSlice> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document not open: ${this.docId}`),\n );\n }\n return AbortablePromise.run<SearchSlice>(async (signal) => {\n const mode = request.mode ?? 'full';\n const path = mode === 'rects' ? wirePaths.layerSearchRects : wirePaths.layerSearchFull;\n const get = (token: string) =>\n this.http.getJson(\n path(this.docId, this.layerName, token),\n (raw) => SearchSliceSchema.parse(raw),\n signal,\n );\n const query = canonicalSearchQuery(request.query);\n\n if (request.cursor !== undefined) {\n let token: SearchToken;\n try {\n token = decodeSearchToken(request.cursor);\n } catch {\n throw new EngineError(EngineErrorCode.InvalidArg, 'malformed search cursor');\n }\n // Local-engine cursor parity: a cursor is pinned to its query and\n // scan origin; replaying it against anything else is a caller bug.\n if (queryIdentity(token.query) !== queryIdentity(query)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'search cursor belongs to a different query — restart the search',\n );\n }\n if (request.startPage !== undefined && request.startPage !== token.startPage) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'startPage conflicts with the cursor — omit startPage when resuming',\n );\n }\n try {\n return await get(request.cursor);\n } catch (err) {\n if (EngineError.is(err, EngineErrorCode.NotFound)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'document changed since this search cursor was issued — restart the search',\n );\n }\n throw err;\n }\n }\n\n const mint = (epoch: string) =>\n encodeSearchToken({\n epoch,\n query,\n ...(request.startPage !== undefined ? { startPage: request.startPage } : {}),\n skip: 0,\n ...(request.budget !== undefined ? { budget: request.budget } : {}),\n });\n try {\n const manifest = await this.manifest.get(signal);\n return await get(mint(searchContentEpoch(manifest)));\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n // Our cached manifest is behind the layer — the standard\n // versioned-read retry: refresh once, re-mint, re-issue.\n const fresh = await this.manifest.refresh(signal);\n return await get(mint(searchContentEpoch(fresh)));\n }\n });\n }\n}\n\n/** Query identity for cursor validation (option order pinned by hand). */\nfunction queryIdentity(query: SearchQuery): string {\n return JSON.stringify([\n query.regex ? 'r' : 'l',\n query.text,\n query.matchCase ? 1 : 0,\n query.matchDiacritics ? 1 : 0,\n query.wholeWord ? 1 : 0,\n query.ignoreWhitespace ? 1 : 0,\n ]);\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\n\n/**\n * Lightweight, **unverified** JWT payload decoder.\n *\n * We use this on the SDK side purely to extract routing information\n * (the `doc_id` claim) so we know which `/v1/docs/:id/head` URL to\n * hit. Signature verification is the server's job — Layer 2 of the\n * token-class-confusion defense in `JwtVerifier.coerceClaims`\n * rejects anything malformed before the bytes are accepted.\n *\n * This module is intentionally cryptography-free: it never imports\n * `crypto` or `jose`. That keeps the SDK lean for browser bundles\n * (jose adds ~50KB minified) and means a misconfigured customer\n * can't accidentally rely on client-side verification.\n */\n\nexport interface UnverifiedClaims {\n doc_id?: string;\n tenant_id?: string;\n sub?: string;\n exp?: number;\n iat?: number;\n /** Pass-through; we don't validate anything else SDK-side. */\n [key: string]: unknown;\n}\n\nexport function decodeUnverifiedClaims(token: string): UnverifiedClaims {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'malformed jwt: expected 3 segments');\n }\n const payloadB64Url = parts[1]!;\n let bytes: Uint8Array;\n try {\n bytes = base64UrlDecode(payloadB64Url);\n } catch (err) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `malformed jwt payload: ${(err as Error).message ?? err}`,\n );\n }\n let json: string;\n try {\n json = new TextDecoder().decode(bytes);\n } catch (err) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `jwt payload is not valid utf-8: ${(err as Error).message ?? err}`,\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch (err) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `jwt payload is not valid json: ${(err as Error).message ?? err}`,\n );\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'jwt payload must be a json object');\n }\n return parsed as UnverifiedClaims;\n}\n\n/**\n * Decode a base64url string into a `Uint8Array`. Works in both Node\n * and modern browsers; we avoid `Buffer` so the SDK stays\n * browser-friendly. `atob` lives on the global in Node 16+ as well.\n */\nfunction base64UrlDecode(b64url: string): Uint8Array {\n const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/');\n const pad = b64.length % 4;\n const padded = pad === 0 ? b64 : b64 + '='.repeat(4 - pad);\n const bin = atob(padded);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n checkCapability,\n checkCollab,\n checkSetGroup,\n decodePdfBits,\n expandRawScope,\n passwordPromptFromState,\n securityStateFromHead,\n type CollabTarget,\n type DocCapability,\n type DocumentAccessInfo,\n type DocumentIdentity,\n type DocumentSecurityService,\n type DocumentSecurityState,\n type DocumentUnlockInput,\n type DocumentUnlockResult,\n type PasswordPrompt,\n} from '@embedpdf/engine-core/runtime';\nimport { AccessResponseSchema, wirePaths, type DocumentHead } from '@embedpdf/engine-core/wire';\n\nimport { decodeUnverifiedClaims } from '../transport/decodeUnverifiedClaims';\nimport type { HttpClient } from '../transport/HttpClient';\n\nexport class CloudDocumentSecurityService implements DocumentSecurityService {\n private state: DocumentSecurityState;\n private access: DocumentAccessInfo | null = null;\n\n /**\n * Parsed JWT identity + scope, decoded once at construction. Used by\n * the local-fallback path for `effectiveScope` and `identity` when\n * /access hasn't run yet (public-share with no CDN, password not\n * yet supplied, etc.).\n */\n private readonly tokenScope: ReadonlyArray<string>;\n private readonly tokenIdentity: DocumentIdentity | null;\n\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n initialHead: DocumentHead,\n private readonly view: { isClosed(): boolean },\n initialToken: string | null = null,\n ) {\n this.state = securityStateFromHead(initialHead);\n const claims = initialToken ? safeDecodeClaims(initialToken) : null;\n this.tokenScope = Array.isArray(claims?.scope) ? (claims!.scope as ReadonlyArray<string>) : [];\n this.tokenIdentity = claims ? identityFromClaims(claims) : null;\n }\n\n get current(): DocumentSecurityState {\n return this.state;\n }\n\n get currentAccess(): DocumentAccessInfo | null {\n return this.access;\n }\n\n /**\n * Expanded capability set. Cloud-canonical post-/access; otherwise\n * computed locally from the JWT scope + /head's pdf bits using the\n * SAME `expandRawScope` helper engine-local calls — so the value\n * matches across engines bit-for-bit on the same inputs.\n */\n get effectiveScope(): ReadonlyArray<string> {\n if (this.access) return this.access.effectiveScope;\n const bits = decodePdfBits(this.state.permissions.bits);\n return Array.from(expandRawScope(this.tokenScope, bits)).sort();\n }\n\n /**\n * Wildcard-aware authorization check — mirrors what the server route layer\n * enforces with. `effectiveScope` alone can't gate UI: it enumerates concrete\n * grants and drops the `*` admin wildcard. So we honor a server-canonical\n * concrete grant when present, then fall back to the same `checkCapability`\n * predicate (which short-circuits `*`) against the JWT scope + /head bits.\n */\n allows(cap: DocCapability): boolean {\n if (this.access?.effectiveScope.includes(cap)) return true;\n const bits = decodePdfBits(this.state.permissions.bits);\n return checkCapability(cap, this.tokenScope, bits);\n }\n\n /**\n * Per-record annotation authorization mirrors — the same\n * `checkCollab`/`checkSetGroup` resolvers the server's route layer\n * enforces with, over the same inputs: the raw scope\n * (server-canonical post-/access, else the JWT's own claim), the\n * caller's identity, and /head's PDF bits. A control gated on these\n * matches the server's allow/deny for the same mutation. False\n * before any token/access context exists — fail closed, same rule\n * as `allows`.\n */\n allowsAnnotationCreate(): boolean {\n const id = this.identity ?? {};\n return checkCollab('create', selfTarget(id), this.rawScope(), id, this.pdfBits());\n }\n\n allowsAnnotationMutation(action: 'update' | 'delete', target: CollabTarget): boolean {\n return checkCollab(action, target, this.rawScope(), this.identity ?? {}, this.pdfBits());\n }\n\n allowsAnnotationGroupAssignment(groupId: string): boolean {\n return checkSetGroup(groupId, this.identity?.group_id, this.rawScope(), this.pdfBits());\n }\n\n /** Raw scope for the collab resolver: server-canonical post-/access, else the JWT claim. */\n private rawScope(): ReadonlyArray<string> {\n return this.access?.scope ?? this.tokenScope;\n }\n\n private pdfBits() {\n return decodePdfBits(this.state.permissions.bits);\n }\n\n /**\n * Identity of the current caller, or null when anonymous.\n *\n * Cloud-canonical post-/access; otherwise the identity claims from\n * the JWT itself. Both are the same shape — the post-/access\n * version is just refreshed to reflect any server-side identity\n * augmentation (rare; reserved for future tenant hooks).\n */\n get identity(): DocumentIdentity | null {\n return this.access?.identity ?? this.tokenIdentity;\n }\n\n /**\n * High-level \"should I prompt for a password?\" — single source of\n * truth, computed via `passwordPromptFromState` so the answer is\n * identical to what the local engine would say for the same\n * security state. See `passwordPromptFromState` for the rules.\n */\n get passwordPrompt(): PasswordPrompt {\n return passwordPromptFromState(this.state);\n }\n\n unlock(input: DocumentUnlockInput): AbortablePromise<DocumentUnlockResult> {\n if (this.view.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<DocumentUnlockResult>(async (signal) => {\n return await this.postAccess(signal, {\n password: input.password,\n mode: input.mode ?? 'any',\n });\n });\n }\n\n /**\n * Cloud-internal: call /v1/access with no password to establish\n * a CDN-credentialed session. Used by `CloudEngine.open` when\n * /head's `access.reasons` includes 'cdn' but NOT 'password' —\n * the server accepts an authenticated /access POST without a\n * password and returns the signed-URL block.\n *\n * Not on the public `DocumentSecurityService` interface — the\n * \"unlock\" verb implies user action, and this path is automatic.\n * Local engine has no equivalent (there's no CDN concept).\n */\n establishAccess(): AbortablePromise<DocumentUnlockResult> {\n if (this.view.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<DocumentUnlockResult>(async (signal) => {\n return await this.postAccess(signal, { mode: 'any' });\n });\n }\n\n /**\n * Single POST /v1/access implementation shared by `unlock()` (with\n * password) and `establishAccess()` (no password). Updates cached\n * security state, caches the access block, and pushes the CDN\n * binding into the HttpClient so subsequent fetches apply CDN\n * tokens via `applyCdnAccess`.\n *\n * `none` CDN adapter → the access block has null overrides/policies\n * and `applyCdnAccess` short-circuits to origin; safe to call always.\n */\n private async postAccess(\n signal: AbortSignal,\n body: { password?: string; mode: 'any' | 'owner' },\n ): Promise<DocumentUnlockResult> {\n const response = await this.http.postJson(\n // Identity rides the PATH — doc and layer, like every layer route;\n // the affinity tier pins the session bootstrap to the document's\n // pod from the very first request.\n wirePaths.access(this.docId, this.layerName),\n {\n ...(body.password ? { password: body.password } : {}),\n mode: body.mode,\n },\n (raw) => AccessResponseSchema.parse(raw),\n signal,\n );\n this.state = response.security;\n this.access = {\n cdn: response.cdn,\n passwordGrant: response.passwordGrant,\n pdfPermissions: response.pdfPermissions,\n scope: response.scope,\n effectiveScope: response.effectiveScope,\n identity: response.identity,\n originPasswordPolicy: response.originPasswordPolicy,\n expiresAt: response.expiresAt,\n // Deployment render lattice. Absent on older servers without render policy support.\n ...(response.renderPolicy ? { renderPolicy: response.renderPolicy } : {}),\n };\n this.http.setCdnAccess({\n cdn: response.cdn,\n docId: this.docId,\n layerName: this.layerName,\n });\n // DocumentUnlockResult.access is `DocumentAccessInfo | undefined`,\n // not `| null`. We carry the local cache as `| null` (clearer\n // \"not yet unlocked\" semantic); coerce at the boundary.\n return { security: this.state, access: this.access ?? undefined };\n }\n}\n\n/**\n * Decode the JWT's payload without verifying. The SDK never verifies\n * tokens client-side — the server is the verifier of record — but it\n * needs the `scope` and identity claims for the local-fallback path\n * of `effectiveScope` / `identity`. Returns null if the token is\n * malformed; the security service treats that as \"no claims known\".\n */\nfunction safeDecodeClaims(token: string): Record<string, unknown> | null {\n try {\n return decodeUnverifiedClaims(token);\n } catch {\n return null;\n }\n}\n\n/**\n * CREATE's CollabTarget is the caller's own identity — the same\n * derivation as engine-local's `ScopeGuard.targetForSelfCreate`, so\n * `:self` trivially passes and `:group=X` matches the caller's\n * default group.\n */\nfunction selfTarget(id: DocumentIdentity): CollabTarget {\n return {\n ...(id.user_id !== undefined ? { userId: id.user_id } : {}),\n ...(id.group_id !== undefined ? { groupId: id.group_id } : {}),\n };\n}\n\nfunction identityFromClaims(claims: Record<string, unknown>): DocumentIdentity | null {\n const out: DocumentIdentity = {};\n if (typeof claims['user_id'] === 'string') out.user_id = claims['user_id'];\n if (typeof claims['group_id'] === 'string') out.group_id = claims['group_id'];\n if (typeof claims['display_name'] === 'string') out.display_name = claims['display_name'];\n if (Array.isArray(claims['groups'])) {\n const groups = (claims['groups'] as unknown[]).filter(\n (g): g is string => typeof g === 'string',\n );\n if (groups.length > 0) out.groups = groups;\n }\n return Object.keys(out).length > 0 ? out : null;\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type AnalyzeInput,\n type ChangeAnalysis,\n type DigestAlgorithm,\n type DocumentSignaturesService,\n type FormFieldRef,\n type SignatureAbortResult,\n type SignatureCompleteInput,\n type SignatureCompleteResult,\n type SignaturePrepareInput,\n type SignaturePrepared,\n type SignatureSnapshot,\n} from '@embedpdf/engine-core/runtime';\nimport {\n ChangeAnalysisSchema,\n SignatureAbortResultSchema,\n SignatureCompleteResultSchema,\n SignaturePreparedWireSchema,\n SignatureSnapshotSchema,\n decodePrepared,\n toBase64,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\nimport type { SessionEventPublisher } from '@embedpdf/engine-services';\n\nimport { buildMutationForm } from './buildMutationForm';\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Cloud-side digital signatures. Two kinds of read, two kinds of URL:\n *\n * - The LAYER view (`list`, and `analyze` of the working copy) is pinned\n * by the manifest's `docVersion`, like every other layer read: a\n * signature is a layer state change, the immutable URL moves with it.\n * - Signed BYTES (`contents`, `digest`, `revisionBytes`, and `analyze`\n * of history) belong to a base VERSION and are content-addressed by\n * the manifest's `baseSha`: immutable forever, shared by every layer\n * and every caller.\n *\n * Signing is the server's two-phase protocol over the same wire shapes\n * the local engine uses. `prepare` and `complete` change the manifest in\n * ways no delta carries (a publish moves `baseSha` itself), so both\n * refresh it before returning.\n */\nexport class CloudDocumentSignaturesService implements DocumentSignaturesService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n ) {}\n\n list(): AbortablePromise<SignatureSnapshot> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<SignatureSnapshot>(async (signal) =>\n this.http.getJsonWithRefresh(\n async (s) => {\n const manifest = await this.manifest.get(s);\n return wirePaths.layerSignatures(this.docId, this.layerName, manifest.docVersion);\n },\n (raw) => SignatureSnapshotSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n ),\n );\n }\n\n contents(field: FormFieldRef): AbortablePromise<Uint8Array> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<Uint8Array>(async (signal) => {\n const manifest = await this.manifest.get(signal);\n const name = await this.fieldName(field, signal);\n return this.http.getBytes(\n wirePaths.docVersionSignatureContents(this.docId, manifest.baseSha, name),\n signal,\n );\n });\n }\n\n digest(field: FormFieldRef, algorithm: DigestAlgorithm): AbortablePromise<Uint8Array> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<Uint8Array>(async (signal) => {\n const manifest = await this.manifest.get(signal);\n const name = await this.fieldName(field, signal);\n return this.http.getBytes(\n wirePaths.docVersionSignatureDigest(this.docId, manifest.baseSha, name, algorithm),\n signal,\n );\n });\n }\n\n revisionBytes(revisionIndex: number): AbortablePromise<Uint8Array> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<Uint8Array>(async (signal) => {\n const manifest = await this.manifest.get(signal);\n return this.http.getBytes(\n wirePaths.docVersionRevision(this.docId, manifest.baseSha, revisionIndex),\n signal,\n );\n });\n }\n\n /**\n * `until: 'working-copy'` (or unset while the layer holds edits) judges\n * the layer's pending edits against the base at the layer URL; anything\n * else is history of the base version and resolves at the version URL.\n */\n analyze(input: AnalyzeInput): AbortablePromise<ChangeAnalysis> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<ChangeAnalysis>(async (signal) => {\n const manifest = await this.manifest.get(signal);\n const workingCopy =\n input.until === 'working-copy' || (input.until === undefined && manifest.working);\n if (workingCopy) {\n return this.http.getJsonWithRefresh(\n async (s) => {\n const current = await this.manifest.get(s);\n return wirePaths.layerSignaturesAnalysis(this.docId, this.layerName, {\n docVersion: current.docVersion,\n since: input.since,\n ...(input.exploratoryLevel !== undefined\n ? { exploratoryLevel: input.exploratoryLevel }\n : {}),\n ...(input.detail !== undefined ? { detail: input.detail } : {}),\n });\n },\n (raw) => ChangeAnalysisSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n }\n return this.http.getJson(\n wirePaths.docVersionAnalysis(this.docId, manifest.baseSha, {\n since: input.since,\n ...(typeof input.until === 'object' ? { until: input.until.revisionIndex } : {}),\n ...(input.exploratoryLevel !== undefined\n ? { exploratoryLevel: input.exploratoryLevel }\n : {}),\n ...(input.detail !== undefined ? { detail: input.detail } : {}),\n }),\n (raw) => ChangeAnalysisSchema.parse(raw),\n signal,\n );\n });\n }\n\n prepare(input: SignaturePrepareInput): AbortablePromise<SignaturePrepared> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<SignaturePrepared>(async (signal) => {\n const { appearance, ...rest } = input;\n const body = {\n ...rest,\n ...(appearance\n ? {\n appearance: {\n resource: 'appearance',\n ...(appearance.pageIndex !== undefined ? { pageIndex: appearance.pageIndex } : {}),\n },\n }\n : {}),\n };\n const form = buildMutationForm(\n body,\n appearance\n ? {\n appearance: {\n bytes: appearance.pdf.slice().buffer as ArrayBuffer,\n mimeType: 'application/pdf',\n name: 'appearance.pdf',\n },\n }\n : {},\n );\n const prepared = await this.http.postMultipartJson(\n wirePaths.layerSignaturesPrepare(this.docId, this.layerName),\n form,\n (raw) => decodePrepared(SignaturePreparedWireSchema.parse(raw)),\n signal,\n );\n // Prepare is a layer write (layerVersion, working, docVersion moved)\n // that returns no mutation envelope: refresh, don't guess.\n await this.manifest.refresh(signal);\n this.publisher.publishLocal({\n type: 'signature.prepared',\n signingId: prepared.signingId,\n field: input.field,\n });\n return prepared;\n });\n }\n\n complete(input: SignatureCompleteInput): AbortablePromise<SignatureCompleteResult> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<SignatureCompleteResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerSignatureComplete(this.docId, this.layerName, input.signingId),\n { cms: toBase64(input.cms), expectedVersion: input.expectedVersion },\n (raw) => SignatureCompleteResultSchema.parse(raw),\n signal,\n );\n // A publish changes the whole manifest in substance (baseSha,\n // baseByteLength, layerVersion, working, every promoted page pin, the\n // plane pointers, the scopes): refresh on `completed` and on a\n // replay alike, then announce the new version.\n await this.manifest.refresh(signal);\n if (result.status === 'completed') {\n this.publisher.publishLocal({\n type: 'signature.completed',\n signingId: input.signingId,\n ...result,\n });\n this.publisher.publishLocal({ type: 'document.versioned', version: result.version });\n }\n return result;\n });\n }\n\n abort(signingId: string): AbortablePromise<SignatureAbortResult> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<SignatureAbortResult>(async (signal) => {\n const result = await this.http.deleteJson(\n wirePaths.layerSignatureAbort(this.docId, this.layerName, signingId),\n (raw) => SignatureAbortResultSchema.parse(raw),\n signal,\n );\n if (result.status === 'aborted') {\n this.publisher.publishLocal({ type: 'signature.aborted', signingId });\n }\n return result;\n });\n }\n\n /** Version routes address a field by its fully qualified name; an object-number ref is resolved through the snapshot. */\n private async fieldName(field: FormFieldRef, signal: AbortSignal): Promise<string> {\n if (field.kind === 'fqn') return field.name;\n const snapshot = await this.http.getJsonWithRefresh(\n async (s) => {\n const manifest = await this.manifest.get(s);\n return wirePaths.layerSignatures(this.docId, this.layerName, manifest.docVersion);\n },\n (raw) => SignatureSnapshotSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n const match = snapshot.signatures.find(\n (s) =>\n s.field.kind === 'objectNumber' && s.field.fieldObjectNumber === field.fieldObjectNumber,\n );\n if (!match) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no signature field #${field.fieldObjectNumber}`,\n );\n }\n return match.fieldName;\n }\n\n private closedRejection(): AbortablePromise<never> | null {\n if (!this.isClosed()) return null;\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type DocumentMetadata,\n type MetadataPatch,\n type MetadataService,\n type MetadataUpdateResult,\n} from '@embedpdf/engine-core/runtime';\nimport {\n DocumentMetadataSchema,\n MetadataUpdateResultSchema,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\nimport type { SessionEventPublisher } from '@embedpdf/engine-services';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { planesInherited } from './planes';\nimport type { HttpClient } from '../transport/HttpClient';\n\nexport class CloudMetadataService implements MetadataService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n ) {}\n\n /**\n * Document metadata read. The Info-dict JSON lives at the\n * content-addressed `/metadata@metadataVersion=N` leaf (not in the\n * manifest); the manifest only publishes the `metadataVersion` pointer.\n * So `read()` pulls `metadataVersion` from the cached manifest, fetches\n * the leaf, and on a 404 (stale pointer) transparently refreshes the\n * manifest and retries once. `metadataVersion` bumps only on metadata\n * writes, so this leaf stays cached across page and annotation edits.\n */\n read(): AbortablePromise<DocumentMetadata> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<DocumentMetadata>(async (signal) => {\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n // Plane-scope rule: the metadata leaf depends on the `metadata`\n // plane — while inherited, one doc-level URL serves every visitor.\n return planesInherited(manifest, ['metadata'])\n ? wirePaths.docMetadata(this.docId, manifest.metadataVersion)\n : wirePaths.layerMetadata(this.docId, this.layerName, manifest.metadataVersion);\n };\n return this.http.getJsonWithRefresh(\n buildPath,\n (raw) => DocumentMetadataSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n });\n }\n\n update(patch: MetadataPatch): AbortablePromise<MetadataUpdateResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<MetadataUpdateResult>(async (signal) => {\n const result = await this.http.postJson(\n wirePaths.layerMetadataUpdate(this.docId, this.layerName),\n patch,\n (raw) => MetadataUpdateResultSchema.parse(raw),\n signal,\n );\n // A metadata write only advances docVersion + metadataVersion (no\n // per-page pin changes, no layoutVersion), so the cached manifest can\n // be patched in place — no refetch.\n if (result.cache) this.manifest.applyMetadata(result.cache);\n this.publisher.publishLocal({ type: 'metadata.updated', ...result });\n return result;\n });\n }\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n createPageImageHandle,\n encodeStableIdKey,\n normalizeAnnotationDraft,\n normalizeAnnotationPatch,\n type WireResourceMap,\n type AnnotationAppearanceImage,\n type AnnotationAppearanceImageOptions,\n type AnnotationAppearanceImagesResult,\n type AnnotationAppearanceRenderOptions,\n type AnnotationAppearancesResult,\n type AnnotationDraft,\n type AnnotationListPageSnapshot,\n type AnnotationPatch,\n type AnnotationRef,\n type AnnotationCreateResult,\n type AnnotationDeleteResult,\n type AnnotationFlattenResult,\n type AnnotationMoveResult,\n type PageFlattenUsage,\n type AnnotationUpdateResult,\n type AttachmentContent,\n type DocumentEventInit,\n type MutationMeta,\n type PageAnnotationsService,\n type PageImageResult,\n type PageNetworkRenderFormat,\n type PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport {\n AnnotationCreateResultSchema,\n AnnotationDeleteResultSchema,\n AnnotationListPageSnapshotSchema,\n AnnotationAppearanceManifestSchema,\n AnnotationFlattenResultSchema,\n AnnotationMoveResultSchema,\n AnnotationUpdateResultSchema,\n annotationAppearancesImageOptionsToWire,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\nimport type { SessionEventPublisher } from '@embedpdf/engine-services';\n\nimport { buildMutationForm, hasResources } from './buildMutationForm';\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { planesInherited } from './planes';\nimport { parseAttachmentContent } from './parseAttachmentContent';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Cloud-side page annotation service. Mirrors the local wiring: each\n * call produces an `AbortablePromise` that propagates `signal.abort()`\n * down to `fetch` and validates the JSON response with the wire-stable\n * Zod schema.\n *\n * Reads use immutable versioned layer URLs discovered from the\n * manifest. Mutations use unversioned layer URLs and are never cached.\n */\nexport class CloudPageAnnotationsService implements PageAnnotationsService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly pageObjectNumber: PageObjectNumber,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n ) {}\n\n list(): AbortablePromise<AnnotationListPageSnapshot> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AnnotationListPageSnapshot>(async (signal) => {\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n const page = manifest.pages.find((p) => p.state.pageObjectNumber === this.pageObjectNumber);\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${this.pageObjectNumber} in document ${this.docId}`,\n );\n }\n // Plane-scope rule: the list depends on the `annotations` plane. A\n // base's own annotations (weak-identity ones included) are simply\n // VISIBLE through an inheriting layer, so every visitor reads ONE\n // doc-level URL served from the base session.\n return planesInherited(manifest, ['annotations'])\n ? wirePaths.docPageAnnotations(\n this.docId,\n this.pageObjectNumber,\n page.cache.annotationVersion,\n )\n : wirePaths.layerPageAnnotations(\n this.docId,\n this.layerName,\n this.pageObjectNumber,\n page.cache.annotationVersion,\n );\n };\n return this.http.getJsonWithRefresh(\n buildPath,\n (raw) => AnnotationListPageSnapshotSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n });\n }\n\n renderAppearances(\n _options?: AnnotationAppearanceRenderOptions,\n ): AbortablePromise<AnnotationAppearancesResult> {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.NotImplemented,\n 'annotations.renderAppearances() raw rasters are not available in the cloud engine; use renderAppearanceImages()',\n ),\n );\n }\n\n renderAppearanceImages(\n options: AnnotationAppearanceImageOptions = {},\n ): AbortablePromise<AnnotationAppearanceImagesResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AnnotationAppearanceImagesResult>(async (signal) => {\n // The cloud appearance endpoint is always content-addressed, so the URL\n // must carry an explicit network format (PNG/WebP). Default to WebP when\n // the caller omits it, matching render.image().\n const format: PageNetworkRenderFormat = options.format ?? 'webp';\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n const page = manifest.pages.find((p) => p.state.pageObjectNumber === this.pageObjectNumber);\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${this.pageObjectNumber} in document ${this.docId}`,\n );\n }\n const wireToken = annotationAppearancesImageOptionsToWire(\n { ...options, format },\n { annotationVersion: page.cache.annotationVersion },\n );\n // Same `annotations` plane switch as list(): the appearance\n // batch shares too.\n return planesInherited(manifest, ['annotations'])\n ? wirePaths.docPageAnnotationAppearances(this.docId, this.pageObjectNumber, wireToken)\n : wirePaths.layerPageAnnotationAppearances(\n this.docId,\n this.layerName,\n this.pageObjectNumber,\n wireToken,\n );\n };\n const form = await this.http.getFormDataWithRefresh(\n buildPath,\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n return parseAppearanceForm(form);\n });\n }\n\n /**\n * Decode and return the file embedded in a FileAttachment annotation.\n * A read over the immutable `attachment-files` leaf, pinned by the\n * manifest's `attachmentsVersion` (annotation-level files re-key on the\n * same pin as document-level ones), with the same stale-404 refresh\n * retry as {@link list}. Weak `index` refs cannot be spliced into a GET\n * URL (no body to carry the revision), so bytes reads require a stable\n * id — the same `:annotKey` routing update()/delete() use.\n */\n downloadFile(ref: AnnotationRef): AbortablePromise<AttachmentContent> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n if (ref.pageObjectNumber !== this.pageObjectNumber) {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `ref.pageObjectNumber ${ref.pageObjectNumber} != page ${this.pageObjectNumber}`,\n ),\n );\n }\n if (ref.kind === 'index') {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n 'downloadFile requires a stable ref (objectNumber or nm); index refs cannot address the content-addressed file leaf',\n ),\n );\n }\n const annotKey = encodeStableIdKey(refToStableId(ref));\n return AbortablePromise.run<AttachmentContent>(async (signal) => {\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n // A FileAttachment annotation's bytes depend on BOTH planes —\n // the annotation must exist in this view (`annotations`) and the\n // byte pin is `attachmentsVersion` (`attachments`).\n return planesInherited(manifest, ['annotations', 'attachments'])\n ? wirePaths.docAnnotationFile(\n this.docId,\n this.pageObjectNumber,\n annotKey,\n manifest.attachmentsVersion,\n )\n : wirePaths.layerAnnotationFile(\n this.docId,\n this.layerName,\n this.pageObjectNumber,\n annotKey,\n manifest.attachmentsVersion,\n );\n };\n const file = await this.http.getFileWithRefresh(\n buildPath,\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n return parseAttachmentContent(file);\n });\n }\n\n create(draft: AnnotationDraft): AbortablePromise<AnnotationCreateResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AnnotationCreateResult>(async (signal) => {\n // Split inline BinarySource fields (stamp images, …) into the wire\n // draft + binary resources. Without resources the request is the\n // plain JSON POST it has always been; with resources it becomes\n // multipart: a `body` JSON part + one `resource:{key}` part each —\n // the mirror image of the appearance-render response.\n const { wire, resources } = await normalizeAnnotationDraft(draft);\n const path = wirePaths.layerPageAnnotationsCreate(\n this.docId,\n this.layerName,\n this.pageObjectNumber,\n );\n const parse = (raw: unknown) => AnnotationCreateResultSchema.parse(raw);\n const result = hasResources(resources)\n ? await this.http.postMultipartJson(path, buildMutationForm(wire, resources), parse, signal)\n : await this.http.postJson(path, wire, parse, signal);\n return this.absorbMutation(result, 'annotation.created');\n });\n }\n\n update(ref: AnnotationRef, patch: AnnotationPatch): AbortablePromise<AnnotationUpdateResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n if (ref.pageObjectNumber !== this.pageObjectNumber) {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `ref.pageObjectNumber ${ref.pageObjectNumber} != page ${this.pageObjectNumber}`,\n ),\n );\n }\n if (ref.kind === 'index') {\n // Index refs cannot be addressed by stable id. Send the full ref\n // in the body so the server can validate the revision and resolve\n // it the same way the local mutator does.\n const path = wirePaths.layerAnnotationByKey(\n this.docId,\n this.layerName,\n ref.pageObjectNumber,\n 'index',\n );\n return AbortablePromise.run<AnnotationUpdateResult>(async (signal) => {\n const { wire, resources } = await normalizeAnnotationPatch(patch);\n const result = await this.patchMutation(path, { ref, patch: wire }, resources, signal);\n return this.absorbMutation(result, 'annotation.updated');\n });\n }\n const stableKey = encodeStableIdKey(refToStableId(ref));\n const path = wirePaths.layerAnnotationByKey(\n this.docId,\n this.layerName,\n ref.pageObjectNumber,\n stableKey,\n );\n return AbortablePromise.run<AnnotationUpdateResult>(async (signal) => {\n const { wire, resources } = await normalizeAnnotationPatch(patch);\n const result = await this.patchMutation(path, { patch: wire }, resources, signal);\n return this.absorbMutation(result, 'annotation.updated');\n });\n }\n\n /** PATCH as plain JSON, or as multipart when the patch carried binaries. */\n private patchMutation(\n path: string,\n body: unknown,\n resources: WireResourceMap,\n signal: AbortSignal,\n ): Promise<AnnotationUpdateResult> {\n const parse = (raw: unknown) => AnnotationUpdateResultSchema.parse(raw);\n if (hasResources(resources)) {\n return this.http.patchMultipartJson(path, buildMutationForm(body, resources), parse, signal);\n }\n return this.http.patchJson(path, body, parse, signal);\n }\n\n delete(ref: AnnotationRef): AbortablePromise<AnnotationDeleteResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n if (ref.pageObjectNumber !== this.pageObjectNumber) {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `ref.pageObjectNumber ${ref.pageObjectNumber} != page ${this.pageObjectNumber}`,\n ),\n );\n }\n if (ref.kind === 'index') {\n // DELETE has no body in plain HTTP, so we PATCH the same\n // 'index' key with `{ ref, op: 'delete' }`. This keeps the\n // semantics atomic on the server (single round-trip).\n const path = wirePaths.layerAnnotationByKey(\n this.docId,\n this.layerName,\n ref.pageObjectNumber,\n 'index',\n );\n return AbortablePromise.run<AnnotationDeleteResult>(async (signal) => {\n const result = await this.http.patchJson(\n path,\n { ref, op: 'delete' },\n (raw) => AnnotationDeleteResultSchema.parse(raw),\n signal,\n );\n return this.absorbMutation(result, 'annotation.deleted');\n });\n }\n const stableKey = encodeStableIdKey(refToStableId(ref));\n const path = wirePaths.layerAnnotationByKey(\n this.docId,\n this.layerName,\n ref.pageObjectNumber,\n stableKey,\n );\n return AbortablePromise.run<AnnotationDeleteResult>(async (signal) => {\n const result = await this.http.deleteJson(\n path,\n (raw) => AnnotationDeleteResultSchema.parse(raw),\n signal,\n );\n return this.absorbMutation(result, 'annotation.deleted');\n });\n }\n\n move(refs: AnnotationRef[], toIndex: number): AbortablePromise<AnnotationMoveResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n // The page is part of the URL; the worker validates per-ref consistency\n // again, but rejecting up front gives a cleaner error from the client side.\n for (const r of refs) {\n if (r.pageObjectNumber !== this.pageObjectNumber) {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `move ref points at page ${r.pageObjectNumber}; service is bound to page ${this.pageObjectNumber}`,\n ),\n );\n }\n }\n const path = wirePaths.layerPageAnnotationsMove(\n this.docId,\n this.layerName,\n this.pageObjectNumber,\n );\n return AbortablePromise.run<AnnotationMoveResult>(async (signal) => {\n const result = await this.http.postJson(\n path,\n { refs, toIndex },\n (raw) => AnnotationMoveResultSchema.parse(raw),\n signal,\n );\n return this.absorbMutation(result, 'annotation.moved');\n });\n }\n\n flatten(\n refs: AnnotationRef[],\n usage: PageFlattenUsage = 'display',\n ): AbortablePromise<AnnotationFlattenResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n for (const r of refs) {\n if (r.pageObjectNumber !== this.pageObjectNumber) {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `flatten ref points at page ${r.pageObjectNumber}; service is bound to page ${this.pageObjectNumber}`,\n ),\n );\n }\n }\n const path = wirePaths.layerPageAnnotationsFlatten(\n this.docId,\n this.layerName,\n this.pageObjectNumber,\n );\n return AbortablePromise.run<AnnotationFlattenResult>(async (signal) => {\n const result = await this.http.postJson(\n path,\n { refs, usage },\n (raw) => AnnotationFlattenResultSchema.parse(raw),\n signal,\n );\n // Nothing applied means no artifact and no coherence bump.\n if (result.meta === null) return result;\n // Flatten bakes annotations into page content, so both planes flip.\n this.manifest.apply(result.meta, ['content', 'annotations']);\n this.publisher.publishLocal({ type: 'annotations.flattened', ...result });\n return result;\n });\n }\n\n exportAppearance(refs: AnnotationRef[]): AbortablePromise<Uint8Array> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n for (const r of refs) {\n if (r.pageObjectNumber !== this.pageObjectNumber) {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `exportAppearance ref points at page ${r.pageObjectNumber}; service is bound to page ${this.pageObjectNumber}`,\n ),\n );\n }\n }\n // A read (gated by doc.download server-side): no absorb, no event.\n return AbortablePromise.run<Uint8Array>(async (signal) =>\n this.http.postJsonBytes(\n wirePaths.layerPageAnnotationsAppearance(this.docId, this.layerName, this.pageObjectNumber),\n { refs },\n signal,\n ),\n );\n }\n\n /**\n * Patch the cached manifest, then publish the mutation to the document's\n * event stream (in that order — listeners reading the manifest in their\n * callback must see post-mutation state). Each call site pairs the event\n * `type` with the matching result by construction; the cast localizes that\n * pairing here instead of widening every site.\n */\n private absorbMutation<T extends { meta: MutationMeta }>(\n result: T,\n type: 'annotation.created' | 'annotation.updated' | 'annotation.deleted' | 'annotation.moved',\n ): T {\n this.manifest.apply(result.meta, ['annotations']);\n this.publisher.publishLocal({\n type,\n pageObjectNumber: this.pageObjectNumber,\n ...result,\n } as unknown as DocumentEventInit);\n return result;\n }\n}\n\n/**\n * Parse the appearance `multipart/form-data` response into the same\n * `AnnotationAppearanceImagesResult` shape the local engine produces. The\n * `manifest` part is validated against the wire schema; each image part is\n * wrapped in a `PageImageHandle` backed by the in-memory blob we already\n * downloaded.\n */\nasync function parseAppearanceForm(form: FormData): Promise<AnnotationAppearanceImagesResult> {\n const manifestRaw = form.get('manifest');\n if (typeof manifestRaw !== 'string') {\n throw new EngineError(\n EngineErrorCode.WireFormat,\n 'appearance response missing JSON manifest part',\n );\n }\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(manifestRaw);\n } catch (err) {\n throw new EngineError(\n EngineErrorCode.WireFormat,\n `appearance manifest is not valid JSON: ${(err as Error)?.message ?? err}`,\n );\n }\n const manifest = AnnotationAppearanceManifestSchema.parse(parsedJson);\n\n const appearances: AnnotationAppearanceImage[] = await Promise.all(\n manifest.appearances.map(async (entry) => {\n const partValue = form.get(entry.part);\n if (partValue === null || typeof partValue === 'string') {\n throw new EngineError(\n EngineErrorCode.WireFormat,\n `appearance response missing image part \"${entry.part}\"`,\n );\n }\n const blob = partValue as Blob;\n const bytes = new Uint8Array(await blob.arrayBuffer());\n const result: PageImageResult = {\n width: entry.width,\n height: entry.height,\n format: entry.format,\n contentType: entry.contentType,\n source: { kind: 'bytes', bytes },\n };\n const image = createPageImageHandle(result, {\n async blob() {\n return blob;\n },\n });\n return {\n ref: entry.ref,\n mode: entry.mode,\n rect: entry.rect,\n image,\n };\n }),\n );\n\n return { pageState: manifest.pageState, appearances };\n}\n\n/**\n * Local helper: project a non-index `AnnotationRef` into the matching\n * `AnnotationStableId` shape so we can route by stable key. The compiler\n * narrows on `ref.kind` here so we can't accidentally pass an index ref.\n */\nfunction refToStableId(\n ref: Extract<AnnotationRef, { kind: 'objectNumber' | 'nm' }>,\n): { kind: 'objectNumber'; value: number } | { kind: 'nm'; value: string } {\n if (ref.kind === 'objectNumber') {\n return { kind: 'objectNumber', value: ref.annotObjectNumber };\n }\n return { kind: 'nm', value: ref.nm };\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type PageGeometryService,\n type PageGeometrySnapshot,\n type PageObjectNumber,\n} from '@embedpdf/engine-core/runtime';\nimport { PageGeometrySnapshotSchema, wirePaths } from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { planesInherited } from './planes';\nimport type { HttpClient } from '../transport/HttpClient';\n\nexport class CloudPageGeometryService implements PageGeometryService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly pageObjectNumber: PageObjectNumber,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n ) {}\n\n read(): AbortablePromise<PageGeometrySnapshot> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageGeometrySnapshot>(async (signal) => {\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n const page = manifest.pages.find((p) => p.state.pageObjectNumber === this.pageObjectNumber);\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${this.pageObjectNumber} in document ${this.docId}`,\n );\n }\n // Plane-scope rule: geometry depends on the `content` plane (see\n // CloudPageTextService for the full rationale).\n return planesInherited(manifest, ['content'])\n ? wirePaths.docPageGeometry(this.docId, this.pageObjectNumber, page.cache.contentVersion)\n : wirePaths.layerPageGeometry(\n this.docId,\n this.layerName,\n this.pageObjectNumber,\n page.cache.contentVersion,\n );\n };\n return this.http.getJsonWithRefresh(\n buildPath,\n (raw) => PageGeometrySnapshotSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n });\n }\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n createPageImageHandle,\n type PageImageHandle,\n type PageImageOptions,\n type PageImageResult,\n type PageNetworkRenderFormat,\n type PageObjectNumber,\n type PageRaster,\n type PageRenderOptions,\n type PageRenderService,\n} from '@embedpdf/engine-core/runtime';\nimport { renderImageOptionsToWire, wirePaths } from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { planesInherited } from './planes';\nimport type { HttpClient } from '../transport/HttpClient';\n\nexport class CloudPageRenderService implements PageRenderService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly pageObjectNumber: PageObjectNumber,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n ) {}\n\n image(options: PageImageOptions = {}): AbortablePromise<PageImageHandle> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageImageHandle>(async (signal) => {\n const format = normalizeFormat(options.format);\n const includeAnnotations = options.includeAnnotations ?? true;\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n const page = manifest.pages.find((p) => p.state.pageObjectNumber === this.pageObjectNumber);\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${this.pageObjectNumber} in document ${this.docId}`,\n );\n }\n // `format` flows through `options` and ends up in the token like\n // every other render option — the wire format treats it uniformly.\n // Normalized above so the URL always carries an explicit,\n // network-supported format (PNG or WebP; default WebP).\n // Annotatedness itself is PATH-expressed (the token/path law): the\n // token never carries it; the annotated family's token carries the\n // `annotationVersion` pin instead.\n const wireToken = renderImageOptionsToWire(\n { ...options, format },\n {\n contentVersion: page.cache.contentVersion,\n ...(includeAnnotations ? { annotationVersion: page.cache.annotationVersion } : {}),\n },\n );\n // Plane-scope rule: a render resolves at the DOC-LEVEL (shared base)\n // path iff every plane it depends on is inherited — annotation-free\n // renders (full pages AND tiles; the rect target rides the same\n // token) depend on `content`, annotated ones on\n // `content + annotations`. Each is its OWN family at BOTH tiers\n // (prefix law: edge grants see only prefixes). 1,000 inheriting\n // visitors → one URL set, one origin render, no layer session.\n if (includeAnnotations) {\n return planesInherited(manifest, ['content', 'annotations'])\n ? wirePaths.docPageRenderAnnotated(this.docId, this.pageObjectNumber, wireToken)\n : wirePaths.layerPageRenderAnnotated(\n this.docId,\n this.layerName,\n this.pageObjectNumber,\n wireToken,\n );\n }\n return planesInherited(manifest, ['content'])\n ? wirePaths.docPageRender(this.docId, this.pageObjectNumber, wireToken)\n : wirePaths.layerPageRender(this.docId, this.layerName, this.pageObjectNumber, wireToken);\n };\n // The advertised URL reflects the CURRENT manifest; the blob loader\n // re-resolves per fetch through the 404 → manifest-refresh rail, so a\n // scope flip (e.g. this layer's first annotation write) self-heals\n // instead of failing on a stale path family.\n const requestPath = await buildPath(signal);\n return createCloudPageImageHandle(\n {\n format,\n contentType: `image/${format}`,\n source: { kind: 'url', url: this.http.absoluteUrl(requestPath) },\n },\n this.http,\n buildPath,\n async (s) => {\n await this.manifest.refresh(s);\n },\n );\n });\n }\n\n raw(_options?: PageRenderOptions): AbortablePromise<PageRaster> {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.NotImplemented,\n 'render.raw() is not available in the cloud engine; use render.image()',\n ),\n );\n }\n}\n\nfunction createCloudPageImageHandle(\n result: PageImageResult,\n http: HttpClient,\n buildPath: (signal: AbortSignal) => Promise<string>,\n onStaleVersion: (signal: AbortSignal) => Promise<void>,\n): PageImageHandle {\n return createPageImageHandle(result, {\n blob: (signal) =>\n http.getBlobWithRefresh(buildPath, onStaleVersion, signal ?? new AbortController().signal),\n });\n}\n\nfunction normalizeFormat(format: PageImageOptions['format']): PageNetworkRenderFormat {\n if (format === undefined) return 'webp';\n if (format === 'png' || format === 'webp') return format;\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `cloud render.image() supports only \"png\" and \"webp\" (got \"${format}\")`,\n );\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type PageObjectNumber,\n type PageTextService,\n type PageTextSnapshot,\n} from '@embedpdf/engine-core/runtime';\nimport { PageTextSnapshotSchema, wirePaths } from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { planesInherited } from './planes';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Cloud-side per-page text service. `read()` fetches the\n * content-addressed URL `/v1/docs/:id/text/pages/:pon/data@contentVersion=N`, where\n * `:P` is the page's current `contentVersion` from the cached\n * manifest. On a 404 (stale version) the SDK transparently refreshes\n * `/head` + `/manifest@docVersion=N`, rebuilds the URL with the fresh `cN`,\n * and retries exactly once.\n */\nexport class CloudPageTextService implements PageTextService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly pageObjectNumber: PageObjectNumber,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n ) {}\n\n read(): AbortablePromise<PageTextSnapshot> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageTextSnapshot>(async (signal) => {\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n const page = manifest.pages.find((p) => p.state.pageObjectNumber === this.pageObjectNumber);\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${this.pageObjectNumber} in document ${this.docId}`,\n );\n }\n // Plane-scope rule: text depends on the `content` plane — while it\n // is inherited, every visitor's layer reads ONE doc-level URL (and\n // the base worker session at the origin).\n return planesInherited(manifest, ['content'])\n ? wirePaths.docPageText(this.docId, this.pageObjectNumber, page.cache.contentVersion)\n : wirePaths.layerPageText(\n this.docId,\n this.layerName,\n this.pageObjectNumber,\n page.cache.contentVersion,\n );\n };\n return this.http.getJsonWithRefresh(\n buildPath,\n (raw) => PageTextSnapshotSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n });\n }\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type PageMeasureService,\n type PdfMeasure,\n type PageMeasurementViewport,\n} from '@embedpdf/engine-core/runtime';\nimport {\n PageMeasurementViewportSchema,\n PageScaleResultSchema,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\nimport type { SessionEventPublisher } from '@embedpdf/engine-services';\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { HttpClient } from '../transport/HttpClient';\n\nexport class CloudPageMeasureService implements PageMeasureService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly pon: number,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n ) {}\n viewports(): AbortablePromise<PageMeasurementViewport[]> {\n return AbortablePromise.run(async (signal) => {\n this.check();\n // Viewports have no independent cache pin. Always read the current layer.\n return this.http.getJson(\n wirePaths.layerPageViewports(this.docId, this.layerName, this.pon),\n (raw) => PageMeasurementViewportSchema.array().parse(raw),\n signal,\n );\n });\n }\n setScale(measure: PdfMeasure | null): AbortablePromise<void> {\n return AbortablePromise.run(async (signal) => {\n await Promise.resolve();\n signal.throwIfAborted();\n this.check();\n const result = await this.http.putJson(\n wirePaths.layerPageScale(this.docId, this.layerName, this.pon),\n { measure },\n (raw) => PageScaleResultSchema.parse(raw),\n signal,\n );\n this.manifest.apply(result.meta, []);\n this.publisher.publishLocal({ type: 'page.viewportsChanged', ...result });\n });\n }\n private check(): void {\n if (this.isClosed())\n throw new EngineError(EngineErrorCode.DocNotOpen, `Document not open: ${this.docId}`);\n }\n}\n","import type { PageHandle, PageObjectNumber } from '@embedpdf/engine-core/runtime';\nimport type { SessionEventPublisher } from '@embedpdf/engine-services';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { CloudPageAnnotationsService } from './CloudPageAnnotationsService';\nimport { CloudPageGeometryService } from './CloudPageGeometryService';\nimport { CloudPageRenderService } from './CloudPageRenderService';\nimport { CloudPageTextService } from './CloudPageTextService';\nimport { CloudPageMeasureService } from './CloudPageMeasureService';\nimport type { HttpClient } from '../transport/HttpClient';\n\nexport class CloudPageHandle implements PageHandle {\n readonly annotations: CloudPageAnnotationsService;\n readonly text: CloudPageTextService;\n readonly geometry: CloudPageGeometryService;\n readonly render: CloudPageRenderService;\n readonly measure: CloudPageMeasureService;\n\n constructor(\n readonly pageObjectNumber: PageObjectNumber,\n readonly pageIndex: number,\n http: HttpClient,\n docId: string,\n layerName: string,\n isClosed: () => boolean,\n manifest: ManifestAccessor,\n publisher: SessionEventPublisher,\n ) {\n this.measure = new CloudPageMeasureService(\n http,\n docId,\n layerName,\n pageObjectNumber,\n isClosed,\n manifest,\n publisher,\n );\n this.annotations = new CloudPageAnnotationsService(\n http,\n docId,\n layerName,\n pageObjectNumber,\n isClosed,\n manifest,\n publisher,\n );\n this.text = new CloudPageTextService(\n http,\n docId,\n layerName,\n pageObjectNumber,\n isClosed,\n manifest,\n );\n this.geometry = new CloudPageGeometryService(\n http,\n docId,\n layerName,\n pageObjectNumber,\n isClosed,\n manifest,\n );\n this.render = new CloudPageRenderService(\n http,\n docId,\n layerName,\n pageObjectNumber,\n isClosed,\n manifest,\n );\n }\n}\n","import type {\n AnnotationCreateResult,\n AnnotationDeleteResult,\n AnnotationMoveResult,\n AnnotationUpdateResult,\n AttachmentCreateResult,\n AttachmentDeleteResult,\n DocumentEvent,\n EventOrigin,\n FormFieldCreateResult,\n FormFieldDeleteResult,\n FormFieldUpdateResult,\n FormEffectsResult,\n FormImportResult,\n FormRepairResult,\n FormSetValueResult,\n FormWidgetLinkResult,\n MetadataUpdateResult,\n PageDeleteResult,\n PageFlattenResult,\n PageInsertResult,\n PageMoveResult,\n PageRotateResult,\n PageRotation,\n PageScaleResult,\n} from '@embedpdf/engine-core/runtime';\n\n/** The SSE `mutation` event body — the audit row in JSON (the server's\n * `toJsonlEvent` shape). `payload` is byte-identical to what the mutating\n * caller received as its HTTP response. */\nexport interface AuditEventRow {\n id: number;\n ts: number;\n sub: string;\n kind: string;\n pageObjectNumber: number | null;\n affectedPages: number[];\n originSessionId: string | null;\n payload: unknown;\n}\n\n/**\n * Translate a remote audit row into a `DocumentEvent` — pure, so the\n * exactly-once and verbatim-payload invariants are unit-testable without a\n * server. Returns `null` for kinds this engine version doesn't know\n * (a NEWER server's events degrade to \"ignored\", never to a crash).\n *\n * Context-field fidelity differs by op, by design of the audit row:\n * - rotate/delete: `affectedPages` is exactly the op's page set; rotation\n * is recovered from the layout (it's absolute — every affected page\n * carries the value).\n * - move: the originator knows which block it moved; the audit row only\n * records the resulting order, so `pageObjectNumbers` is the full new\n * order and `destIndex` is absent (remote consumers use `layout`).\n */\nexport function auditRowToEvent(row: AuditEventRow, mySessionId: string): DocumentEvent | null {\n if (row.originSessionId === mySessionId) return null; // own echo — local publish covered it\n\n const origin: EventOrigin = {\n kind: 'remote',\n sessionId: row.originSessionId ?? `unknown:${row.sub}`,\n sub: row.sub,\n ts: row.ts,\n serverId: row.id,\n };\n\n switch (row.kind) {\n case 'measure.setScale':\n return { type: 'page.viewportsChanged', origin, ...(row.payload as PageScaleResult) };\n case 'annot.create':\n return {\n type: 'annotation.created',\n pageObjectNumber: row.pageObjectNumber ?? row.affectedPages[0] ?? 0,\n origin,\n ...(row.payload as AnnotationCreateResult),\n };\n case 'annot.update':\n return {\n type: 'annotation.updated',\n pageObjectNumber: row.pageObjectNumber ?? row.affectedPages[0] ?? 0,\n origin,\n ...(row.payload as AnnotationUpdateResult),\n };\n case 'annot.delete':\n return {\n type: 'annotation.deleted',\n pageObjectNumber: row.pageObjectNumber ?? row.affectedPages[0] ?? 0,\n origin,\n ...(row.payload as AnnotationDeleteResult),\n };\n case 'annot.move':\n return {\n type: 'annotation.moved',\n pageObjectNumber: row.pageObjectNumber ?? row.affectedPages[0] ?? 0,\n origin,\n ...(row.payload as AnnotationMoveResult),\n };\n case 'pages.move':\n return {\n type: 'pages.moved',\n pageObjectNumbers: row.affectedPages,\n origin,\n ...(row.payload as PageMoveResult),\n };\n case 'pages.rotate': {\n const payload = row.payload as PageRotateResult;\n const rotation = (payload.layout.pages.find(\n (page) => page.pageObjectNumber === row.affectedPages[0],\n )?.rotation ?? 0) as PageRotation;\n return {\n type: 'pages.rotated',\n pageObjectNumbers: row.affectedPages,\n rotation,\n origin,\n ...payload,\n };\n }\n case 'pages.delete':\n return {\n type: 'pages.deleted',\n pageObjectNumbers: row.affectedPages,\n origin,\n ...(row.payload as PageDeleteResult),\n };\n // Two audit kinds share the `pages.inserted` event (bytes-import and\n // blank creation produce the same result shape) — the audit log keeps\n // them distinct for history, the event stream cares about effect. The\n // originator's `destIndex` gesture field stays absent on remote events\n // by design: remote consumers derive placement from `layout`.\n case 'pages.insert':\n case 'pages.insertBlank':\n return {\n type: 'pages.inserted',\n origin,\n ...(row.payload as PageInsertResult),\n };\n case 'pages.flatten':\n return {\n type: 'pages.flattened',\n origin,\n ...(row.payload as PageFlattenResult),\n };\n case 'metadata.update':\n return {\n type: 'metadata.updated',\n origin,\n ...(row.payload as MetadataUpdateResult),\n };\n case 'attachment.create':\n return {\n type: 'attachment.created',\n origin,\n ...(row.payload as AttachmentCreateResult),\n };\n case 'attachment.delete':\n return {\n type: 'attachment.deleted',\n origin,\n ...(row.payload as AttachmentDeleteResult),\n };\n // Form mutations: two audit kinds share the `form.valueChanged` event\n // (setValue and reset produce the same result shape) — the audit log\n // keeps them distinct for history, the event stream cares about effect.\n case 'form.setValue':\n case 'form.reset':\n return { type: 'form.valueChanged', origin, ...(row.payload as FormSetValueResult) };\n case 'form.import':\n return { type: 'form.imported', origin, ...(row.payload as FormImportResult) };\n case 'form.repair':\n return { type: 'form.repaired', origin, ...(row.payload as FormRepairResult) };\n case 'form.createField':\n return { type: 'form.fieldCreated', origin, ...(row.payload as FormFieldCreateResult) };\n case 'form.updateField':\n case 'form.setSignatureAppearance':\n return { type: 'form.fieldUpdated', origin, ...(row.payload as FormFieldUpdateResult) };\n case 'form.deleteField':\n return { type: 'form.fieldDeleted', origin, ...(row.payload as FormFieldDeleteResult) };\n case 'form.attachWidget':\n return { type: 'form.widgetAttached', origin, ...(row.payload as FormWidgetLinkResult) };\n case 'form.detachWidget':\n return { type: 'form.widgetDetached', origin, ...(row.payload as FormWidgetLinkResult) };\n case 'form.applyEffects':\n return { type: 'form.effectsApplied', origin, ...(row.payload as FormEffectsResult) };\n default:\n return null;\n }\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\n\nimport type { AuditEventRow } from './auditRowToEvent';\nimport type { HttpClient } from '../transport/HttpClient';\n\nexport interface SseClientOptions {\n http: HttpClient;\n path: string;\n /** Resume cursor for the first connect (manifest `auditHead` /\n * `lastServerId`); `null` subscribes \"from now\". */\n initialCursor: number | null;\n /** One parsed audit row, in id order. The cursor has already advanced. */\n onRow(row: AuditEventRow): void;\n /** Server says the gap is too large to replay — refetch state. */\n onFullRefresh(): void;\n /** Auth is permanently gone (401/403); the client stopped for good. */\n onAuthLost(): void;\n}\n\n/**\n * Fetch-based SSE consumer. Browser-native `EventSource` cannot send an\n * `Authorization` header, so the stream rides the same `HttpClient` as\n * every other request (same token provider, same session header).\n *\n * Resilience model: the cursor is the only state that matters. Every\n * (re)connect sends `Last-Event-ID: cursor`; the server replays the gap\n * from the audit log. So a dropped stream costs latency, never events —\n * the client needs no buffering and no acknowledgements.\n *\n * - network drop / server close / `auth-expiring` → reconnect with\n * jittered exponential backoff (500ms → 30s; reset after a stream\n * that lived ≥30s). `auth-expiring` reconnects pick up a fresh token\n * from the HttpClient's provider automatically.\n * - 401/403 → permanent: `onAuthLost`, no retry loop against a dead\n * credential.\n */\nexport class SseClient {\n private cursor: number | null;\n private closed = false;\n private abort: AbortController | null = null;\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n private retryDelayMs = 500;\n\n constructor(private readonly opts: SseClientOptions) {\n this.cursor = opts.initialCursor;\n }\n\n open(): void {\n if (this.closed) return;\n void this.run();\n }\n\n close(): void {\n this.closed = true;\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.abort?.abort();\n }\n\n get lastEventId(): number | null {\n return this.cursor;\n }\n\n private async run(): Promise<void> {\n const startedAt = Date.now();\n this.abort = new AbortController();\n try {\n const res = await this.opts.http.stream(\n this.opts.path,\n this.cursor !== null ? { 'Last-Event-ID': String(this.cursor) } : {},\n this.abort.signal,\n );\n if (res.status === 401 || res.status === 403) {\n this.closed = true;\n this.opts.onAuthLost();\n return;\n }\n if (!res.ok || !res.body) {\n throw new EngineError(EngineErrorCode.Network, `events stream HTTP ${res.status}`);\n }\n await this.consume(res.body);\n // Stream ended (server close / auth-expiring / network): reconnect.\n if (Date.now() - startedAt >= 30_000) this.retryDelayMs = 500;\n } catch {\n // Aborts land here too; `closed` guards the reschedule below.\n }\n if (this.closed) return;\n const jitter = this.retryDelayMs * (0.5 + Math.random() * 0.5);\n this.retryTimer = setTimeout(() => void this.run(), jitter);\n this.retryDelayMs = Math.min(this.retryDelayMs * 2, 30_000);\n }\n\n private async consume(body: ReadableStream<Uint8Array>): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n for (;;) {\n const { done, value } = await reader.read();\n if (done || this.closed) return;\n buffer += decoder.decode(value, { stream: true });\n for (;;) {\n const sep = buffer.indexOf('\\n\\n');\n if (sep < 0) break;\n const block = buffer.slice(0, sep);\n buffer = buffer.slice(sep + 2);\n this.dispatch(block);\n }\n }\n }\n\n private dispatch(block: string): void {\n if (block.startsWith(':')) return; // heartbeat / comment\n let id: number | null = null;\n let event = 'message';\n const data: string[] = [];\n for (const line of block.split('\\n')) {\n if (line.startsWith('id:')) id = Number(line.slice(3).trim());\n else if (line.startsWith('event:')) event = line.slice(6).trim();\n else if (line.startsWith('data:')) data.push(line.slice(5).trim());\n }\n if (id !== null && Number.isFinite(id)) this.cursor = id;\n if (event === 'mutation') {\n try {\n this.opts.onRow(JSON.parse(data.join('\\n')) as AuditEventRow);\n } catch {\n // A malformed row advances the cursor and is skipped; the audit log\n // remains the source of truth for anyone who refetches.\n }\n } else if (event === 'full-refresh') {\n this.opts.onFullRefresh();\n } else if (event === 'auth-revoked') {\n // Terminal: the credential is dead by decree, not by clock — never\n // retry against it (a reconnect would just 401; this saves the trip\n // and surfaces the loss immediately).\n this.closed = true;\n this.abort?.abort();\n this.opts.onAuthLost();\n }\n // 'auth-expiring' needs no handling: the server ends the stream right\n // after, and the reconnect path fetches a fresh token.\n }\n}\n","import {\n AbortError,\n AbortablePromise,\n DEFAULT_PDF_SAVE_MODE,\n EngineError,\n EngineErrorCode,\n type AttachmentsCache,\n type DocumentAnnotationsService,\n type DocumentActionsService,\n type DocumentAttachmentsService,\n type DocumentSignaturesService,\n type DocumentEvent,\n type DocumentEventStream,\n type DocumentFormsService,\n type DocumentHandle,\n type DocumentPagesService,\n type DocumentRedactionService,\n CONTINUOUS_RENDER_POLICY,\n type DocumentRenderService,\n type DocumentSecurityService,\n type MetadataCache,\n type MutationMeta,\n type PageHandle,\n type PageObjectNumber,\n type PageStructureCache,\n type PdfSaveMode,\n} from '@embedpdf/engine-core/runtime';\nimport {\n DEFAULT_LAYER_NAME,\n DocumentHeadSchema,\n DocumentManifestSchema,\n wirePaths,\n type DocumentHead,\n type DocumentManifest,\n type LayerScopePlane,\n} from '@embedpdf/engine-core/wire';\nimport { EventHub, SessionEventPublisher } from '@embedpdf/engine-services';\n\nimport { CloudDocumentActionsService } from './CloudDocumentActionsService';\nimport { CloudDocumentAnnotationsService } from './CloudDocumentAnnotationsService';\nimport { CloudDocumentAttachmentsService } from './CloudDocumentAttachmentsService';\nimport { CloudDocumentFormsService } from './CloudDocumentFormsService';\nimport { CloudDocumentPagesService } from './CloudDocumentPagesService';\nimport { CloudDocumentRedactionService } from './CloudDocumentRedactionService';\nimport { CloudDocumentSearchService } from './CloudDocumentSearchService';\nimport { CloudDocumentSecurityService } from './CloudDocumentSecurityService';\nimport { CloudDocumentSignaturesService } from './CloudDocumentSignaturesService';\nimport { CloudMetadataService } from './CloudMetadataService';\nimport { CloudPageHandle } from './CloudPageHandle';\nimport { auditRowToEvent } from '../realtime/auditRowToEvent';\nimport { SseClient } from '../realtime/SseClient';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Read accessor handed to every `CloudPage…Service`. The closure\n * captures `this` so the services don't carry a direct reference\n * back to the document handle (smaller circular-ref surface, easier\n * to mock in unit tests).\n */\nexport interface ManifestAccessor {\n /** Cached manifest (cold-fetched once, kept across requests). */\n get(signal: AbortSignal): Promise<DocumentManifest>;\n /** Force re-fetch of `/head` + `/manifest@docVersion=N`; replaces the cache. */\n refresh(signal: AbortSignal): Promise<DocumentManifest>;\n /**\n * Absorb mutation-returned state/cache deltas when safe. `owns` names the\n * planes this mutation kind takes ownership of (the monotone-flip\n * rule): annotation/form writes own `annotations`; flatten and\n * redaction-apply own `content + annotations`. The flip runs even when\n * the version-gated delta merge is skipped — scopes only ever move\n * base → layer, so any observed mutation proves the plane diverged.\n */\n apply(meta: MutationMeta, owns: readonly LayerScopePlane[]): void;\n /** Advance the cached manifest's docVersion + layoutVersion after a page\n * STRUCTURE op that keeps the page set intact (move, rotate). */\n applyPageStructure(cache: PageStructureCache): void;\n /** Same advance for a page delete, additionally dropping the deleted\n * pages' manifest rows so per-page leaf URLs stop resolving locally. */\n applyPageDelete(cache: PageStructureCache, deletedPages: PageObjectNumber[]): void;\n /** Page insert: the cached manifest has no rows for the fresh PONs (the\n * result carries only their object numbers), so the absorb drops the\n * cache for a lazy refetch instead of patching. */\n applyPageInsert(cache: PageStructureCache): void;\n /** Advance the cached manifest's docVersion + metadataVersion after a metadata write. */\n applyMetadata(cache: MetadataCache): void;\n /** Advance the cached manifest's docVersion + attachmentsVersion after an\n * attachment create/delete. */\n applyAttachments(cache: AttachmentsCache): void;\n}\n\nexport class CloudDocumentHandle implements DocumentHandle {\n readonly id: string;\n readonly capabilities = {\n weakAnnotationEditSessions: 'required',\n pageEditSessions: 'unsupported',\n } as const;\n readonly metadata: CloudMetadataService;\n readonly annotations: DocumentAnnotationsService;\n readonly actions: DocumentActionsService;\n readonly attachments: DocumentAttachmentsService;\n readonly signatures: DocumentSignaturesService;\n readonly forms: DocumentFormsService;\n readonly search: CloudDocumentSearchService;\n readonly pages: DocumentPagesService;\n readonly redaction: DocumentRedactionService;\n readonly security: DocumentSecurityService;\n readonly render: DocumentRenderService;\n readonly events: DocumentEventStream;\n private readonly publisher: SessionEventPublisher;\n private readonly hub: EventHub;\n private readonly sessionId: string;\n private sseClient: SseClient | null = null;\n private sseSubscribers = 0;\n private closed = false;\n\n /**\n * Cached current manifest. Populated on first read by `getManifest`\n * (or any `page().*` call that needs to know a version). Replaced\n * wholesale on `refreshManifest`. Cleared on `close`.\n *\n * Memory model: one DocumentManifest per open handle. Per-page\n * version reads are O(pages.length) `.find(...)` lookups; if a\n * profiling pass ever shows that as hot, swap for a Map keyed by\n * `pageObjectNumber`. Today's documents are page-sparse so the\n * scan is cheaper than the hash overhead.\n */\n private manifestCache: DocumentManifest | null = null;\n private inflightManifest: Promise<DocumentManifest> | null = null;\n private manifestFloorVersion = 0;\n private pendingInitialHead: DocumentHead | null;\n\n private readonly manifestAccessor: ManifestAccessor;\n\n constructor(\n private readonly http: HttpClient,\n id: string,\n private readonly layerName: string = DEFAULT_LAYER_NAME,\n initialHead?: DocumentHead,\n /**\n * The doc-scoped JWT the engine was opened with, decoded\n * unverified to populate the security service's local-fallback\n * `effectiveScope` / `identity` accessors. Optional for backward\n * compatibility; without it the local-fallback path returns an\n * empty scope and null identity until /access is called.\n */\n initialToken: string | null = null,\n sessionId: string = `cloud:anon:${id}`,\n ) {\n this.id = id;\n this.pendingInitialHead = initialHead ?? null;\n const security = new CloudDocumentSecurityService(\n http,\n id,\n layerName,\n initialHead ?? fallbackUnknownHead(id),\n { isClosed: () => this.closed },\n initialToken,\n );\n this.security = security;\n // The deployment's render lattice rides /v1/access (mutable policy\n // never lives in immutable manifests). Reuse the cached access block\n // when present; otherwise establish access on demand — the same call\n // the CDN path uses, so this can never add a second handshake shape.\n // A pre-lattice server (no renderPolicy field) enforces nothing:\n // `continuous` is the honest answer.\n this.render = {\n policy: async () => {\n const cached = security.currentAccess ?? (await security.establishAccess()).access ?? null;\n const advertised = cached?.renderPolicy;\n if (!advertised) return CONTINUOUS_RENDER_POLICY;\n return {\n kind: 'lattice',\n fullPage: { widths: advertised.fullPage.widths },\n ...(advertised.tiles ? { tiles: advertised.tiles } : {}),\n ...(advertised.appearances ? { appearances: advertised.appearances } : {}),\n ...(advertised.maxRenderPixels !== undefined\n ? { maxRenderPixels: advertised.maxRenderPixels }\n : {}),\n formats: advertised.formats,\n background: advertised.background,\n enforced: advertised.enforced,\n };\n },\n };\n const hub = new EventHub();\n this.hub = hub;\n this.sessionId = sessionId;\n // Your OWN mutations publish here at POST-confirmation time (kind:\n // 'local'); the remote channel (SSE) publishes everyone else's into the\n // same hub. Exactly one event per mutation, either way. The SSE stream\n // is LAZY: it opens on the first subscriber and closes on the last —\n // non-collaborative usage never holds a connection (browsers cap ~6\n // per origin on HTTP/1.1).\n this.events = {\n subscribe: (listener) => {\n const unsubscribe = hub.subscribe(listener);\n this.retainRemoteStream();\n let released = false;\n return () => {\n unsubscribe();\n if (!released) {\n released = true;\n this.releaseRemoteStream();\n }\n };\n },\n lastServerId: () => hub.lastServerId(),\n };\n this.publisher = new SessionEventPublisher(hub, sessionId);\n this.manifestAccessor = {\n get: (signal) => this.getManifest(signal),\n refresh: (signal) => this.refreshManifest(signal),\n apply: (meta, owns) => this.absorbMutation(meta, owns),\n applyPageStructure: (cache) => this.absorbPageStructure(cache),\n applyPageDelete: (cache, deletedPages) => this.absorbPageDelete(cache, deletedPages),\n applyPageInsert: (cache) => this.absorbPageInsert(cache),\n applyMetadata: (cache) => this.absorbMetadata(cache),\n applyAttachments: (cache) => this.absorbAttachments(cache),\n };\n this.metadata = new CloudMetadataService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n );\n this.annotations = new CloudDocumentAnnotationsService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n );\n this.actions = new CloudDocumentActionsService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n );\n this.attachments = new CloudDocumentAttachmentsService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n );\n this.signatures = new CloudDocumentSignaturesService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n );\n this.forms = new CloudDocumentFormsService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n );\n this.search = new CloudDocumentSearchService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n );\n this.pages = new CloudDocumentPagesService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n );\n this.redaction = new CloudDocumentRedactionService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n );\n }\n\n page(pageObjectNumber: PageObjectNumber): PageHandle {\n return new CloudPageHandle(\n pageObjectNumber,\n -1,\n this.http,\n this.id,\n this.layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n );\n }\n\n download(opts: { mode?: PdfSaveMode } = {}): AbortablePromise<Uint8Array> {\n if (this.closed) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.id} is closed`),\n );\n }\n const mode = opts.mode ?? DEFAULT_PDF_SAVE_MODE;\n return AbortablePromise.run<Uint8Array>(async (signal) => {\n const buildPath = async () => {\n const manifest = await this.getManifest(signal);\n return wirePaths.layerDownloadVersioned(this.id, this.layerName, {\n docVersion: manifest.docVersion,\n mode,\n });\n };\n try {\n return await this.http.getBytes(await buildPath(), signal);\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n await this.refreshManifest(signal);\n return this.http.getBytes(await buildPath(), signal);\n }\n });\n }\n\n /**\n * Return the cached manifest, fetching cold-cache once if needed.\n * Concurrent callers share a single inflight request (singleflight)\n * so an N-page handle that opens N services in parallel still\n * triggers exactly one `/head` + `/manifest@docVersion=N` round-trip.\n */\n async getManifest(signal: AbortSignal): Promise<DocumentManifest> {\n if (this.manifestCache) return this.manifestCache;\n if (!this.inflightManifest) {\n this.startManifestFetch({ allowInitialHead: true });\n }\n const promise = this.inflightManifest;\n if (!promise) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `manifest fetch was not started for document ${this.id}`,\n );\n }\n return awaitSignal(promise, signal);\n }\n\n /**\n * Force re-fetch. Used by the transparent-retry path when a leaf\n * URL returns 404 (stale version). Replaces `manifestCache`\n * wholesale so the next `getManifest()` is a Map lookup.\n */\n async refreshManifest(signal: AbortSignal): Promise<DocumentManifest> {\n const promise = this.startManifestFetch({ allowInitialHead: false });\n return awaitSignal(promise, signal);\n }\n\n /**\n * Monotone plane-scope flip: mark the planes a mutation OWNS as layer-scoped in\n * the cached manifest. Scopes only ever move base → layer (no revert op\n * exists), so flipping is safe under ANY event ordering — a duplicate or\n * out-of-order event still proves the plane diverged at some point — and\n * the manifest fetch stays the authoritative source (the 404 → refresh\n * rail heals any miss, e.g. a future mutation kind this client doesn't\n * know about).\n */\n private flipScopes(owns: readonly LayerScopePlane[]): void {\n const cache = this.manifestCache;\n const scopes = cache?.scopes;\n if (!cache || !scopes) return;\n if (owns.every((plane) => scopes[plane] === 'layer')) return;\n const next = { ...scopes };\n for (const plane of owns) next[plane] = 'layer';\n this.manifestCache = { ...cache, scopes: next };\n }\n\n absorbMutation(meta: MutationMeta, owns: readonly LayerScopePlane[]): void {\n this.flipScopes(owns);\n const delta = meta.cacheDelta;\n if (delta) {\n this.manifestFloorVersion = Math.max(this.manifestFloorVersion, delta.docVersion);\n }\n this.inflightManifest = null;\n\n if (!this.manifestCache) return;\n if (delta) {\n if (delta.docVersion <= this.manifestCache.docVersion) return;\n if (delta.previousDocVersion !== this.manifestCache.docVersion) {\n this.manifestCache = null;\n return;\n }\n }\n\n const byPageObjectNumber = new Map(\n this.manifestCache.pages.map((page) => [page.state.pageObjectNumber, page]),\n );\n for (const pageState of meta.affectedPages) {\n const existing = byPageObjectNumber.get(pageState.pageObjectNumber);\n if (existing) {\n byPageObjectNumber.set(pageState.pageObjectNumber, {\n ...existing,\n state: pageState,\n });\n }\n }\n if (delta) {\n for (const page of delta.pages) {\n const existing = byPageObjectNumber.get(page.pageObjectNumber);\n if (existing) {\n byPageObjectNumber.set(page.pageObjectNumber, {\n ...existing,\n cache: page.cache,\n });\n }\n }\n }\n this.manifestCache = {\n ...this.manifestCache,\n docVersion: delta?.docVersion ?? this.manifestCache.docVersion,\n // Bulk annotations pin: absorbed when the mutation bumped it, so the\n // next `listRawAll` addresses the fresh bulk leaf without a\n // 404-refresh round trip.\n ...(delta?.annotationsVersion !== undefined\n ? { annotationsVersion: delta.annotationsVersion }\n : {}),\n // The signing fences: every ordinary commit writes an artifact\n // (`working`), and the layer's write serial when the delta names it.\n ...(delta?.layerVersion !== undefined ? { layerVersion: delta.layerVersion } : {}),\n ...(delta?.working !== undefined ? { working: delta.working } : {}),\n // The manifest is a per-page registry keyed by pageObjectNumber, not a\n // display-order list — geometry/order now lives in `pages.list()`\n // (/layout). Keep a deterministic order by PON so cache merges are\n // stable; display order is the SDK's concern via PageLayout.index.\n pages: Array.from(byPageObjectNumber.values()).sort(\n (a, b) => a.state.pageObjectNumber - b.state.pageObjectNumber,\n ),\n };\n }\n\n /**\n * Patch the cached manifest after a set-preserving page-structure op (move,\n * rotate). Both are purely structural: they advance `docVersion` (so leaf\n * URLs re-resolve) and `layoutVersion` (so the /layout leaf re-fetches),\n * but leave every per-page pin untouched — a rotate renders the SAME\n * normalized bitmaps, a move the same pages. We raise the floor\n * unconditionally and, when our cache is exactly one version behind,\n * advance it in place; otherwise we drop it and refetch lazily.\n */\n private absorbPageStructure(cache: PageStructureCache): void {\n // Move/rotate own the LAYOUT plane only: normalized render/text/\n // geometry artifacts survive structural ops, so content keeps sharing.\n this.flipScopes(['layout']);\n this.manifestFloorVersion = Math.max(this.manifestFloorVersion, cache.docVersion);\n this.inflightManifest = null;\n\n if (!this.manifestCache) return;\n if (cache.docVersion <= this.manifestCache.docVersion) return;\n if (cache.previousDocVersion !== this.manifestCache.docVersion) {\n this.manifestCache = null;\n return;\n }\n this.manifestCache = {\n ...this.manifestCache,\n docVersion: cache.docVersion,\n layoutVersion: cache.layoutVersion,\n };\n }\n\n /**\n * Patch the cached manifest after a page delete: the shared structural\n * advance plus dropping the deleted pages' manifest rows, so no leaf URL\n * for a retired PON can be built from the cache (a stale request would\n * 404 anyway — this keeps the failure local and instant).\n */\n private absorbPageDelete(cache: PageStructureCache, deletedPages: PageObjectNumber[]): void {\n // Delete changes the page SET: a view that removed content must never\n // resolve base artifacts again, so content AND annotations flip with\n // layout.\n this.flipScopes(['layout', 'content', 'annotations']);\n this.manifestFloorVersion = Math.max(this.manifestFloorVersion, cache.docVersion);\n this.inflightManifest = null;\n\n if (!this.manifestCache) return;\n if (cache.docVersion <= this.manifestCache.docVersion) return;\n if (cache.previousDocVersion !== this.manifestCache.docVersion) {\n this.manifestCache = null;\n return;\n }\n const deleted = new Set(deletedPages);\n this.manifestCache = {\n ...this.manifestCache,\n docVersion: cache.docVersion,\n layoutVersion: cache.layoutVersion,\n pages: this.manifestCache.pages.filter((page) => !deleted.has(page.state.pageObjectNumber)),\n };\n }\n\n /**\n * Patch bookkeeping after a page insert — the mirror of\n * {@link absorbPageDelete}, with one asymmetry: delete can patch the\n * cached manifest losslessly (it only REMOVES rows), but an insert needs\n * manifest rows for the fresh PONs and the result doesn't carry them. So\n * this absorb flips the planes (insert changes the page SET, so like\n * delete it owns content + annotations alongside layout), raises the\n * version floor, and DROPS the cache — the next read refetches a manifest\n * that includes the new pages' rows. The UI never waits on that refetch:\n * the mutation result / event already carries the full new layout.\n */\n private absorbPageInsert(cache: PageStructureCache): void {\n this.flipScopes(['layout', 'content', 'annotations']);\n this.manifestFloorVersion = Math.max(this.manifestFloorVersion, cache.docVersion);\n this.inflightManifest = null;\n this.manifestCache = null;\n }\n\n /**\n * Patch the cached manifest after a metadata write. Symmetric with\n * {@link absorbPageMove}: a metadata edit advances `docVersion` (so leaf\n * URLs re-resolve) and `metadataVersion` (so the /metadata leaf re-fetches),\n * but leaves `layoutVersion` and every per-page pin untouched. Raise the\n * floor unconditionally and, when our cache is exactly one version behind,\n * advance it in place; otherwise drop it and refetch lazily.\n */\n private absorbMetadata(cache: MetadataCache): void {\n this.flipScopes(['metadata']);\n this.manifestFloorVersion = Math.max(this.manifestFloorVersion, cache.docVersion);\n this.inflightManifest = null;\n\n if (!this.manifestCache) return;\n if (cache.docVersion <= this.manifestCache.docVersion) return;\n if (cache.previousDocVersion !== this.manifestCache.docVersion) {\n this.manifestCache = null;\n return;\n }\n this.manifestCache = {\n ...this.manifestCache,\n docVersion: cache.docVersion,\n metadataVersion: cache.metadataVersion,\n };\n }\n\n /**\n * Patch the cached manifest after an attachment create/delete. Symmetric\n * with {@link absorbMetadata}: an attachment write advances `docVersion`\n * (so leaf URLs re-resolve) and `attachmentsVersion` (so the /attachments\n * listing and /attachment-files leaves re-fetch), but leaves\n * `layoutVersion` and every per-page pin untouched. Raise the floor\n * unconditionally and, when our cache is exactly one version behind,\n * advance it in place; otherwise drop it and refetch lazily.\n */\n private absorbAttachments(cache: AttachmentsCache): void {\n this.flipScopes(['attachments']);\n this.manifestFloorVersion = Math.max(this.manifestFloorVersion, cache.docVersion);\n this.inflightManifest = null;\n\n if (!this.manifestCache) return;\n if (cache.docVersion <= this.manifestCache.docVersion) return;\n if (cache.previousDocVersion !== this.manifestCache.docVersion) {\n this.manifestCache = null;\n return;\n }\n this.manifestCache = {\n ...this.manifestCache,\n docVersion: cache.docVersion,\n attachmentsVersion: cache.attachmentsVersion,\n };\n }\n\n private startManifestFetch(opts: { allowInitialHead: boolean }): Promise<DocumentManifest> {\n const ctrl = new AbortController();\n const promise = this.fetchManifest(ctrl.signal, opts);\n this.inflightManifest = promise;\n promise\n .then((manifest) => {\n if (\n manifest.docVersion >= this.manifestFloorVersion &&\n (!this.manifestCache || manifest.docVersion >= this.manifestCache.docVersion)\n ) {\n this.manifestCache = manifest;\n }\n })\n .catch(() => undefined)\n .finally(() => {\n if (this.inflightManifest === promise) {\n this.inflightManifest = null;\n }\n });\n return promise;\n }\n\n private async fetchManifest(\n signal: AbortSignal,\n opts: { allowInitialHead: boolean },\n ): Promise<DocumentManifest> {\n if (this.closed) {\n throw new EngineError(EngineErrorCode.DocNotOpen, `document ${this.id} is closed`);\n }\n const head = opts.allowInitialHead ? this.consumeInitialHead() : null;\n if (head) {\n try {\n return await this.fetchManifestForHead(head, signal);\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n // A mutation may have landed between open() and the first\n // manifest read. The seed is one-shot, so fall through to the\n // normal /head path and learn the current docVersion.\n }\n }\n\n // Refreshes and stale-seed recovery always re-fetch `/head` first\n // so we learn the current `docVersion`; chasing the manifest with\n // a stale `:D` would 404 by definition.\n const freshHead = await this.http.getJson(\n wirePaths.layerHead(this.id, this.layerName),\n (raw) => DocumentHeadSchema.parse(raw),\n signal,\n );\n return this.fetchManifestForHead(freshHead, signal);\n }\n\n private consumeInitialHead(): DocumentHead | null {\n const head = this.pendingInitialHead;\n this.pendingInitialHead = null;\n return head;\n }\n\n private fetchManifestForHead(head: DocumentHead, signal: AbortSignal): Promise<DocumentManifest> {\n return this.http.getJson(\n wirePaths.layerManifest(this.id, this.layerName, head.docVersion),\n (raw) => DocumentManifestSchema.parse(raw),\n signal,\n );\n }\n\n close(): AbortablePromise<void> {\n if (this.closed) {\n return AbortablePromise.resolveValue<void>(undefined);\n }\n this.closed = true;\n this.sseClient?.close();\n this.sseClient = null;\n this.manifestCache = null;\n this.inflightManifest = null;\n return AbortablePromise.resolveValue<void>(undefined);\n }\n\n private retainRemoteStream(): void {\n this.sseSubscribers += 1;\n if (this.sseSubscribers > 1 || this.closed || this.sseClient) return;\n this.sseClient = new SseClient({\n http: this.http,\n path: wirePaths.layerEvents(this.id, this.layerName),\n // Gapless handshake: resume from the newest cursor we know — events\n // already seen, else the cached manifest's transactional auditHead.\n // Null (cold start, no manifest yet) subscribes \"from now\", which is\n // exact too: the first manifest fetched afterwards is newer anyway.\n initialCursor: this.hub.lastServerId() ?? this.manifestCache?.auditHead ?? null,\n onRow: (row) => {\n // Advance the cached manifest's audit cursor — own echoes and\n // unknown kinds included — so a later `listRawAll` never stamps a\n // cursor older than the pins the absorbed cache hands it.\n if (this.manifestCache && row.id > this.manifestCache.auditHead) {\n this.manifestCache = { ...this.manifestCache, auditHead: row.id };\n }\n const event = auditRowToEvent(row, this.sessionId);\n if (!event) return; // own echo or unknown kind\n // Absorb BEFORE publish: a listener reading the manifest in its\n // callback must see post-mutation state (same order as local).\n this.absorbRemoteEvent(event);\n this.hub.publish(event);\n },\n onFullRefresh: () => {\n // Too far behind to replay: drop the cache; the next read refetches.\n this.manifestCache = null;\n this.inflightManifest = null;\n // Tell subscribers their event-derived state may be stale — the\n // gap's mutations will never arrive as events.\n this.hub.publish({ type: 'stream.desynced', reason: 'backlog-overflow', ts: Date.now() });\n },\n onAuthLost: () => {\n // The stream is gone for good under this credential. Local events\n // keep flowing; remote delivery resumes if the doc is re-opened\n // with a fresh token.\n this.sseClient = null;\n },\n });\n this.sseClient.open();\n }\n\n private releaseRemoteStream(): void {\n this.sseSubscribers = Math.max(0, this.sseSubscribers - 1);\n if (this.sseSubscribers === 0 && this.sseClient) {\n this.sseClient.close();\n this.sseClient = null;\n }\n }\n\n /** Patch the cached manifest from a REMOTE event's coherence pins — the\n * same absorb rails local mutations use, so reads stay warm no matter\n * whose hand caused the change. */\n private absorbRemoteEvent(event: DocumentEvent): void {\n switch (event.type) {\n case 'page.viewportsChanged':\n this.absorbMutation(event.meta, []);\n return;\n case 'annotation.created':\n case 'annotation.updated':\n case 'annotation.deleted':\n case 'annotation.moved':\n this.absorbMutation(event.meta, ['annotations']);\n return;\n case 'pages.moved':\n case 'pages.rotated':\n if (event.cache) this.absorbPageStructure(event.cache);\n return;\n case 'pages.deleted':\n if (event.cache) this.absorbPageDelete(event.cache, event.pageObjectNumbers);\n return;\n case 'pages.inserted':\n if (event.cache) this.absorbPageInsert(event.cache);\n return;\n case 'metadata.updated':\n if (event.cache) this.absorbMetadata(event.cache);\n return;\n case 'attachment.created':\n case 'attachment.deleted':\n if (event.cache) this.absorbAttachments(event.cache);\n return;\n case 'form.valueChanged':\n case 'form.imported':\n case 'form.repaired':\n case 'form.fieldCreated':\n case 'form.fieldUpdated':\n case 'form.fieldDeleted':\n case 'form.widgetAttached':\n case 'form.widgetDetached':\n // Form mutations ship the same MutationMeta rails as annotations:\n // affected pages are the ones whose widget appearances changed.\n // Widgets ARE annotations, so they own the same plane.\n this.absorbMutation(event.meta, ['annotations']);\n return;\n case 'form.effectsApplied':\n // No-op batches are never audited, but keep the nullable guard at\n // the consumer boundary for forward/backward wire compatibility.\n if (event.meta) this.absorbMutation(event.meta, ['annotations']);\n return;\n case 'pages.flattened':\n // Flatten bakes annotations into page content: both planes flip.\n if (event.meta) this.absorbMutation(event.meta, ['content', 'annotations']);\n return;\n case 'redaction.applied':\n // Redaction-apply rewrites content and consumes the marks: both\n // planes flip — and this is the security-relevant divergence, so a\n // remote apply must stop this client's base reads immediately.\n if (event.meta) this.absorbMutation(event.meta, ['content', 'annotations']);\n return;\n }\n }\n}\n\nfunction fallbackUnknownHead(id: string): DocumentHead {\n return {\n id,\n baseSha: '',\n storageSizeBytes: 0,\n docVersion: 1,\n state: 'ready',\n encryption: { state: 'unknown', requiresPassword: null },\n permissions: {\n known: false,\n bits: null,\n allAllowed: null,\n openedAs: null,\n securityHandlerRevision: null,\n canUpgradeToOwner: false,\n },\n access: {\n required: true,\n reasons: ['permissions-unknown'],\n endpoint: wirePaths.access(id, DEFAULT_LAYER_NAME),\n },\n };\n}\n\nfunction awaitSignal<T>(promise: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) {\n return Promise.reject(new AbortError(signal.reason));\n }\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n reject(new AbortError(signal.reason));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (value) => {\n signal.removeEventListener('abort', onAbort);\n resolve(value);\n },\n (reason) => {\n signal.removeEventListener('abort', onAbort);\n reject(reason);\n },\n );\n });\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\n\n/**\n * Share-session exchange: the client half of the no-backend embed flow.\n *\n * A share token (`shr_…`) is a REFERENCE to a stored grant on the\n * server, not a credential — `exchangeShareToken` trades it for an\n * ordinary short-lived doc JWT, and `shareSessionSource` wraps that in\n * a self-renewing token source. Because the engine's transport\n * invokes its token source on every request (and SSE reconnects call\n * it again), renewal is nothing more than \"exchange again when the\n * cached session is nearly out\" — no timers, no listeners.\n *\n * The endpoint requires a browser `Origin` header (the server checks\n * it against the grant's allowlist). Browsers attach it automatically;\n * non-browser callers (tests, SSR) must supply a `fetch` that does.\n */\n\nexport interface ShareSession {\n /** Doc-scoped session JWT carrying the grant's capabilities. */\n token: string;\n docId: string;\n layerName: string;\n /** Unix seconds when `token` expires. */\n expiresAt: number;\n}\n\nexport interface ShareExchangeOptions {\n /** Passphrase for protected grants (`SharePasswordRequired` otherwise). */\n password?: string;\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * Thrown on a non-OK exchange. `code` is the server's wire code:\n * `SharePasswordRequired` (prompt and retry with a password),\n * `OriginNotAllowed` / `OriginRequired`, `ShareExpired`, `NotFound`\n * (unknown or revoked — indistinguishable by design), or\n * `TooManyRequests`.\n */\nexport class ShareExchangeError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly status: number,\n ) {\n super(message);\n this.name = 'ShareExchangeError';\n }\n}\n\nexport async function exchangeShareToken(\n baseUrl: string,\n shareToken: string,\n opts: ShareExchangeOptions = {},\n): Promise<ShareSession> {\n const doFetch = opts.fetch ?? globalThis.fetch;\n const res = await doFetch(`${baseUrl.replace(/\\/$/, '')}/v1/share-sessions`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n shareToken,\n ...(opts.password !== undefined ? { password: opts.password } : {}),\n }),\n });\n if (!res.ok) {\n let code = 'Unknown';\n let message = `share exchange failed with status ${res.status}`;\n try {\n const payload = (await res.json()) as { error?: { code?: string; message?: string } };\n if (payload.error?.code) code = payload.error.code;\n if (payload.error?.message) message = payload.error.message;\n } catch {\n // Non-JSON error body; keep the status-shaped message.\n }\n throw new ShareExchangeError(code, message, res.status);\n }\n return (await res.json()) as ShareSession;\n}\n\n/**\n * Lift a {@link ShareExchangeError} into the engine's error taxonomy, so\n * `open({ kind: 'share' })` and every later renewal fail with the same\n * `EngineError` family as all other engine calls. The wire code and HTTP\n * status survive in `details`; the original error rides as `cause`.\n *\n * `SharePasswordRequired` gets its own engine code — it is the one outcome\n * callers branch on programmatically (prompt for the grant passphrase and\n * retry). Everything else maps by meaning, with the HTTP status as the\n * fallback discriminator.\n */\nexport function engineErrorFromShareExchange(error: ShareExchangeError): EngineError {\n const code =\n error.code === 'SharePasswordRequired'\n ? EngineErrorCode.SharePasswordRequired\n : error.code === 'NotFound'\n ? EngineErrorCode.NotFound\n : error.code === 'ShareExpired' ||\n error.code === 'OriginNotAllowed' ||\n error.code === 'OriginRequired'\n ? EngineErrorCode.Forbidden\n : error.status === 401\n ? EngineErrorCode.Unauthenticated\n : error.status === 400\n ? EngineErrorCode.InvalidArg\n : EngineErrorCode.Unknown;\n return new EngineError(code, `share exchange failed: ${error.message}`, {\n details: { shareCode: error.code, status: error.status },\n cause: error,\n });\n}\n\n/** Renew this many seconds before `expiresAt` so in-flight requests never race expiry. */\nconst RENEW_MARGIN_SECONDS = 60;\n\n/**\n * A caching, self-renewing token source over the exchange — the callable\n * member of the engine's `TokenSource` union, assignable wherever one is\n * taken.\n * Concurrent callers share one in-flight exchange; a failed exchange\n * clears it so the next request retries rather than caching the error.\n */\nexport function shareSessionSource(\n baseUrl: string,\n shareToken: string,\n opts: ShareExchangeOptions = {},\n): () => Promise<string> {\n let session: ShareSession | null = null;\n let inflight: Promise<string> | null = null;\n return async () => {\n if (session && session.expiresAt - Date.now() / 1000 > RENEW_MARGIN_SECONDS) {\n return session.token;\n }\n inflight ??= exchangeShareToken(baseUrl, shareToken, opts)\n .then((next) => {\n session = next;\n return next.token;\n })\n .finally(() => {\n inflight = null;\n });\n return inflight;\n };\n}\n","import {\n AbortError,\n EngineError,\n EngineErrorCode,\n type SerializedEngineError,\n} from '@embedpdf/engine-core/runtime';\nimport {\n applyCdnAccess,\n EngineErrorPayloadSchema,\n type CdnAccessInfoForApply,\n} from '@embedpdf/engine-core/wire';\n\nexport interface HttpClientOptions {\n baseUrl: string;\n /**\n * Optional bearer token. Either a string or a function that\n * returns a fresh token on every call (so callers can rotate\n * without re-creating the engine). When absent, requests go out\n * without an `Authorization` header — useful for the public-share\n * scenario where the doc-scoped token is provided per-`open` and\n * the engine itself has no engine-level credentials.\n */\n token?: string | (() => string | Promise<string>);\n /**\n * Engine-instance session id, sent as `X-Engine-Session-Id` on every\n * request. The server stores it on mutation audit rows so this\n * instance's SSE stream can drop its own echoes (exactly-once events).\n */\n sessionId?: string;\n /** Replace the global fetch (e.g. in Node tests with undici). */\n fetch?: typeof globalThis.fetch;\n /**\n * Document affinity key: `X-CloudPDF-Doc` is sent BY DEFAULT on\n * origin-bound doc requests so consistent-hash load balancers can pin\n * a document's traffic to one warm replica. Routing hints are\n * unconditional client behavior — whether they are USED is the\n * operator's choice at the load balancer, never the app's. Derived\n * from the request path (`/v1/docs/:docId/…` — the same extraction\n * the Helm chart's uri-mode fallback uses); never sent on\n * CDN-rewritten requests.\n *\n * `false` is an ESCAPE HATCH, not a feature toggle: use it only\n * against a stale server whose CORS allowlist predates the header\n * (browser preflights would fail) or behind a proxy that rejects\n * unknown request headers.\n */\n docAffinityHeader?: boolean;\n /** Observability: fired once per transport-level retry (engine busy /\n * restarting). Lets apps count sheds without wrapping every call. */\n onRetry?: (info: { path: string; code: string; attempt: number; waitMs: number }) => void;\n}\n\n/**\n * Per-document binding for CDN URL rewriting. `CloudDocumentHandle`\n * calls `setCdnAccess` after `/v1/access` succeeds; the HttpClient\n * then runs every outgoing request through `applyCdnAccess` so\n * granted resources are routed to the CDN with the matching signed\n * query params (or cookies/auth header for the cookie/header\n * adapter modes).\n *\n * Set to `null` when the session is reset or when `/access` was\n * never called (public-share with no CDN configured).\n */\nexport interface CdnBinding {\n readonly cdn: CdnAccessInfoForApply | null;\n readonly docId: string;\n readonly layerName: string;\n}\n\n/**\n * A raw-bytes response plus its headers. The attachment-file leaves carry\n * their metadata as headers (`Content-Type`, `X-EmbedPDF-File-Name`), so\n * unlike `getBytes` the caller needs the `Headers` object back.\n */\nexport interface HttpFileResponse {\n bytes: Uint8Array;\n headers: Headers;\n}\n\nexport class HttpClient {\n private readonly base: string;\n private readonly tokenFn: (() => string | Promise<string>) | null;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly docAffinityHeader: boolean;\n private readonly onRetry: HttpClientOptions['onRetry'];\n\n private static readonly MAX_RETRIES = 2;\n private static readonly RETRY_AFTER_CAP_MS = 5_000;\n private static readonly RETRY_AFTER_DEFAULT_MS = 1_000;\n private readonly sessionId: string | null;\n private cdnBinding: CdnBinding | null = null;\n\n constructor(opts: HttpClientOptions) {\n this.base = opts.baseUrl.replace(/\\/$/, '');\n const token = opts.token;\n this.tokenFn = token === undefined ? null : typeof token === 'function' ? token : () => token;\n this.sessionId = opts.sessionId ?? null;\n this.fetchFn = opts.fetch ?? globalThis.fetch.bind(globalThis);\n this.docAffinityHeader = opts.docAffinityHeader ?? true;\n this.onRetry = opts.onRetry;\n }\n\n /** Normalized server base URL (no trailing slash). */\n get baseUrl(): string {\n return this.base;\n }\n\n /**\n * The fetch implementation this client sends requests through (injected\n * or global). Exposed so sibling transports spawned per-open — the\n * share-session exchange, most of all — ride the same fetch the engine\n * was configured with (test doubles, SSR `Origin`-attaching wrappers).\n */\n get fetchImpl(): typeof globalThis.fetch {\n return this.fetchFn;\n }\n\n /**\n * Return a clone of this client bound to a different bearer. Used\n * by `CloudEngine.open` to mint a per-handle client carrying the\n * per-open token, so each opened document's RPCs go out under\n * the right authorization without disturbing the engine-level\n * token.\n */\n withToken(token: string | (() => string | Promise<string>)): HttpClient {\n return new HttpClient({\n baseUrl: this.baseUrl,\n token,\n ...(this.sessionId ? { sessionId: this.sessionId } : {}),\n fetch: this.fetchFn,\n });\n }\n\n /**\n * Raw streaming GET (the SSE channel). Same auth/session headers and\n * error mapping as every other request; the caller owns the body stream.\n */\n async stream(\n path: string,\n headers: Record<string, string>,\n signal: AbortSignal,\n ): Promise<Response> {\n return this.request(path, {\n method: 'GET',\n headers: new Headers({ Accept: 'text/event-stream', ...headers }),\n signal,\n });\n }\n\n /**\n * Install (or clear) the per-session CDN binding. Pass `null` to\n * route everything to origin again — useful on session close or\n * when an adapter swap happens mid-session (rare).\n *\n * The HttpClient stays dumb about WHEN to do this; the cloud\n * document handle pushes the binding in after /access succeeds.\n *\n * Side effect: in the browser, signedCookies are written to\n * `document.cookie` once per setCdnAccess call so the CDN edge\n * receives them on subsequent fetches. Node side ignores cookies\n * for now (cookie jar wiring deferred until needed for tests).\n */\n setCdnAccess(binding: CdnBinding | null): void {\n this.cdnBinding = binding;\n if (binding?.cdn?.signedCookies && typeof globalThis.document !== 'undefined') {\n for (const cookie of binding.cdn.signedCookies) {\n const parts = [`${cookie.name}=${cookie.value}`];\n parts.push(`Path=${cookie.path ?? '/'}`);\n if (cookie.domain) parts.push(`Domain=${cookie.domain}`);\n if (cookie.expires) parts.push(`Expires=${new Date(cookie.expires * 1000).toUTCString()}`);\n parts.push('SameSite=None', 'Secure');\n globalThis.document.cookie = parts.join('; ');\n }\n }\n }\n\n /** Current CDN binding (or null). Exposed for diagnostics/tests. */\n get currentCdnBinding(): CdnBinding | null {\n return this.cdnBinding;\n }\n\n absoluteUrl(path: string): string {\n return `${this.baseUrl}${path}`;\n }\n\n async getBlob(path: string, signal: AbortSignal): Promise<Blob> {\n const res = await this.request(path, { method: 'GET', signal });\n if (!res.ok) await this.throwFromBody(res);\n return await res.blob();\n }\n\n async getBytes(path: string, signal: AbortSignal): Promise<Uint8Array> {\n const res = await this.request(path, {\n method: 'GET',\n headers: new Headers({ Accept: 'application/pdf' }),\n signal,\n });\n if (!res.ok) await this.throwFromBody(res);\n return new Uint8Array(await res.arrayBuffer());\n }\n\n /**\n * Resolve the current bearer token. Awaits the user-supplied\n * token factory if it returns a promise. Used by the cloud\n * engine to read doc-scoped claims **without** verifying — the\n * server is the verifier of record. Throws when no token is\n * configured.\n */\n async currentToken(): Promise<string> {\n if (!this.tokenFn) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'http client has no token configured');\n }\n return await this.tokenFn();\n }\n\n async getJson<T>(path: string, parser: (raw: unknown) => T, signal: AbortSignal): Promise<T> {\n const res = await this.request(path, { method: 'GET', signal });\n return await this.parseJsonResponse(res, parser);\n }\n\n /**\n * GET a versioned URL with transparent stale-version recovery. If\n * the server returns 404 (the well-known \"this version is gone\"\n * signal for content-addressed reads), call `onStaleVersion` (which\n * the caller wires to a manifest refresh), then re-resolve `buildPath`\n * and retry the GET exactly once. Any non-404 error propagates.\n *\n * The retry budget is hard-capped at 1: after a refresh, if the\n * server's idea of the current version is still ahead of the\n * client's view, the second request fails normally — this matches\n * the CDN cache invariant (\"a versioned URL's bytes are immutable\n * for its lifetime\").\n */\n async getJsonWithRefresh<T>(\n buildPath: (signal: AbortSignal) => Promise<string>,\n parser: (raw: unknown) => T,\n onStaleVersion: (signal: AbortSignal) => Promise<void>,\n signal: AbortSignal,\n ): Promise<T> {\n const initialPath = await buildPath(signal);\n try {\n return await this.getJson(initialPath, parser, signal);\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n await onStaleVersion(signal);\n const retryPath = await buildPath(signal);\n return await this.getJson(retryPath, parser, signal);\n }\n }\n\n /**\n * GET a `multipart/form-data` body and parse it with the platform's\n * `Response.formData()` (works in browsers and undici). Text parts come\n * back as strings, parts with a filename as `Blob`s.\n */\n async getFormData(path: string, signal: AbortSignal): Promise<FormData> {\n const res = await this.request(path, {\n method: 'GET',\n headers: new Headers({ Accept: 'multipart/form-data' }),\n signal,\n });\n if (!res.ok) await this.throwFromBody(res);\n return await res.formData();\n }\n\n /**\n * `getFormData` with the same single-retry stale-version recovery as\n * {@link getJsonWithRefresh}: a 404 on a versioned URL triggers\n * `onStaleVersion` (a manifest refresh) and one re-resolve + retry.\n */\n async getFormDataWithRefresh(\n buildPath: (signal: AbortSignal) => Promise<string>,\n onStaleVersion: (signal: AbortSignal) => Promise<void>,\n signal: AbortSignal,\n ): Promise<FormData> {\n const initialPath = await buildPath(signal);\n try {\n return await this.getFormData(initialPath, signal);\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n await onStaleVersion(signal);\n const retryPath = await buildPath(signal);\n return await this.getFormData(retryPath, signal);\n }\n }\n\n /**\n * `getBlob` with the same single-retry stale-version recovery as\n * {@link getJsonWithRefresh}: a 404 on a versioned URL triggers\n * `onStaleVersion` (a manifest refresh) and one re-resolve + retry.\n * Render blobs ride this rail: a scope flip re-resolves the\n * doc-vs-layer path family instead of failing on a stale URL.\n */\n async getBlobWithRefresh(\n buildPath: (signal: AbortSignal) => Promise<string>,\n onStaleVersion: (signal: AbortSignal) => Promise<void>,\n signal: AbortSignal,\n ): Promise<Blob> {\n const initialPath = await buildPath(signal);\n try {\n return await this.getBlob(initialPath, signal);\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n await onStaleVersion(signal);\n const retryPath = await buildPath(signal);\n return await this.getBlob(retryPath, signal);\n }\n }\n\n /** GET raw bytes plus the response headers (attachment-file leaves). */\n async getFile(path: string, signal: AbortSignal): Promise<HttpFileResponse> {\n const res = await this.request(path, { method: 'GET', signal });\n if (!res.ok) await this.throwFromBody(res);\n return { bytes: new Uint8Array(await res.arrayBuffer()), headers: res.headers };\n }\n\n /**\n * `getFile` with the same single-retry stale-version recovery as\n * {@link getJsonWithRefresh}: a 404 on a versioned URL triggers\n * `onStaleVersion` (a manifest refresh) and one re-resolve + retry.\n */\n async getFileWithRefresh(\n buildPath: (signal: AbortSignal) => Promise<string>,\n onStaleVersion: (signal: AbortSignal) => Promise<void>,\n signal: AbortSignal,\n ): Promise<HttpFileResponse> {\n const initialPath = await buildPath(signal);\n try {\n return await this.getFile(initialPath, signal);\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n await onStaleVersion(signal);\n const retryPath = await buildPath(signal);\n return await this.getFile(retryPath, signal);\n }\n }\n\n async postMultipartJson<T>(\n path: string,\n body: FormData,\n parser: (raw: unknown) => T,\n signal: AbortSignal,\n ): Promise<T> {\n const res = await this.request(path, { method: 'POST', body, signal });\n return await this.parseJsonResponse(res, parser);\n }\n\n /** PATCH counterpart of {@link postMultipartJson} (binary-carrying mutations). */\n async patchMultipartJson<T>(\n path: string,\n body: FormData,\n parser: (raw: unknown) => T,\n signal: AbortSignal,\n ): Promise<T> {\n const res = await this.request(path, { method: 'PATCH', body, signal });\n return await this.parseJsonResponse(res, parser);\n }\n\n async postJson<T>(\n path: string,\n body: unknown,\n parser: (raw: unknown) => T,\n signal: AbortSignal,\n ): Promise<T> {\n const res = await this.requestJson(path, 'POST', body, signal);\n return await this.parseJsonResponse(res, parser);\n }\n\n async putJson<T>(\n path: string,\n body: unknown,\n parser: (raw: unknown) => T,\n signal: AbortSignal,\n ): Promise<T> {\n return this.parseJsonResponse(await this.requestJson(path, 'PUT', body, signal), parser);\n }\n\n /** POST a JSON body and return the raw binary response (pages.extract). */\n async postJsonBytes(path: string, body: unknown, signal: AbortSignal): Promise<Uint8Array> {\n const res = await this.requestJson(path, 'POST', body, signal);\n if (!res.ok) await this.throwFromBody(res);\n return new Uint8Array(await res.arrayBuffer());\n }\n\n /** POST a raw binary body (FDF/XFDF import) and parse the JSON response. */\n async postBytesJson<T>(\n path: string,\n bytes: Uint8Array,\n contentType: string,\n parser: (raw: unknown) => T,\n signal: AbortSignal,\n ): Promise<T> {\n const headers = new Headers({ 'Content-Type': contentType });\n // Copy into a fresh ArrayBuffer: `bytes` may be a view over a larger\n // (or SharedArrayBuffer-backed) buffer, which fetch bodies reject.\n const body = new Uint8Array(bytes).buffer as ArrayBuffer;\n const res = await this.request(path, { method: 'POST', body, headers, signal });\n return await this.parseJsonResponse(res, parser);\n }\n\n async patchJson<T>(\n path: string,\n body: unknown,\n parser: (raw: unknown) => T,\n signal: AbortSignal,\n ): Promise<T> {\n const res = await this.requestJson(path, 'PATCH', body, signal);\n return await this.parseJsonResponse(res, parser);\n }\n\n async deleteJson<T>(path: string, parser: (raw: unknown) => T, signal: AbortSignal): Promise<T> {\n const res = await this.request(path, { method: 'DELETE', signal });\n return await this.parseJsonResponse(res, parser);\n }\n\n async deleteEmpty(path: string, signal: AbortSignal): Promise<void> {\n const res = await this.request(path, { method: 'DELETE', signal });\n if (res.status === 204) return;\n if (!res.ok) await this.throwFromBody(res);\n }\n\n async postEmpty(path: string, body: unknown, signal: AbortSignal): Promise<void> {\n const res = await this.requestJson(path, 'POST', body, signal);\n if (res.status === 204) return;\n if (!res.ok) await this.throwFromBody(res);\n }\n\n private requestJson(\n path: string,\n method: 'POST' | 'PATCH' | 'PUT',\n body: unknown,\n signal: AbortSignal,\n ): Promise<Response> {\n const headers = new Headers({ 'Content-Type': 'application/json' });\n return this.request(path, {\n method,\n body: JSON.stringify(body ?? {}),\n headers,\n signal,\n });\n }\n\n private async request(path: string, init: RequestInit): Promise<Response> {\n const { url, extraHeader, routedToCdn } = this.resolveOutgoing(path);\n const headers = new Headers(init.headers ?? {});\n if (this.tokenFn) {\n const token = await this.tokenFn();\n headers.set('Authorization', `Bearer ${token}`);\n }\n if (!headers.has('Accept')) headers.set('Accept', 'application/json');\n if (this.sessionId) headers.set('X-Engine-Session-Id', this.sessionId);\n if (extraHeader) headers.set(extraHeader.name, extraHeader.value);\n // Document affinity key: origin-bound doc requests only (a CDN GET is a\n // \"simple\" request today — a custom header would create preflights\n // for zero routing value). Same extraction as the chart's uri-mode\n // regex, so the header tier and the ingress fallback cannot disagree.\n if (this.docAffinityHeader && !routedToCdn) {\n const doc = /^\\/v1\\/docs\\/([^/]+)\\//.exec(path);\n if (doc) headers.set('X-CloudPDF-Doc', decodeURIComponent(doc[1]!));\n }\n // Code-keyed backpressure retry: ONLY our own 503s (`EngineBusy` =\n // shed before dispatch, `EngineRestarting` = the apply never landed)\n // — both mean NOTHING HAPPENED, so retrying is method-agnostic-safe,\n // mutations included. A foreign 503 keeps today's semantics.\n for (let attempt = 0; ; attempt++) {\n const res = await this.execute(url, { ...init, headers });\n if (\n res.status !== 503 ||\n attempt >= HttpClient.MAX_RETRIES ||\n isStreamBody(init.body ?? null)\n ) {\n return res;\n }\n const code = await peekErrorCode(res);\n if (code === null || !RETRYABLE_503.has(code)) return res;\n const hinted = Number(res.headers.get('retry-after'));\n const base = Number.isFinite(hinted)\n ? Math.min(Math.max(hinted, 0) * 1000, HttpClient.RETRY_AFTER_CAP_MS)\n : HttpClient.RETRY_AFTER_DEFAULT_MS;\n const waitMs = base * (0.9 + 0.2 * Math.random());\n this.onRetry?.({ path, code, attempt, waitMs });\n await sleepRacingAbort(waitMs, init.signal ?? null);\n }\n }\n\n private async execute(url: string, init: RequestInit): Promise<Response> {\n try {\n return await this.fetchFn(url, init);\n } catch (err) {\n // undici's fetch propagates whatever was passed to AbortController.abort().\n // Anything that arrives while signal.aborted is true is an abort, regardless\n // of the wire-shape (DOMException, plain Error, string, ...).\n if (init.signal?.aborted) {\n throw new AbortError(init.signal.reason ?? err);\n }\n if ((err as { name?: string } | null)?.name === 'AbortError') {\n throw new AbortError((err as Error).message);\n }\n throw new EngineError(\n EngineErrorCode.Network,\n `network error: ${(err as Error)?.message ?? err}`,\n {\n cause: err,\n },\n );\n }\n }\n\n private async parseJsonResponse<T>(res: Response, parser: (raw: unknown) => T): Promise<T> {\n if (!res.ok) await this.throwFromBody(res);\n const json: unknown = await res.json().catch(() => ({}));\n try {\n return parser(json);\n } catch (err) {\n throw new EngineError(\n EngineErrorCode.WireFormat,\n `unexpected response shape: ${(err as Error)?.message ?? err}`,\n {\n cause: err,\n },\n );\n }\n }\n\n /**\n * Decide where this request actually goes. With no CDN binding (or\n * binding's `cdn` is null) every request stays on origin. Otherwise\n * `applyCdnAccess` decides per-request based on the resource the\n * path resolves to (and whether the caller's scope granted CDN\n * access to it).\n */\n private resolveOutgoing(path: string): {\n url: string;\n extraHeader: { name: string; value: string } | null;\n routedToCdn: boolean;\n } {\n if (!this.cdnBinding || !this.cdnBinding.cdn) {\n return { url: `${this.baseUrl}${path}`, extraHeader: null, routedToCdn: false };\n }\n const applied = applyCdnAccess({\n path,\n originUrl: this.baseUrl,\n docId: this.cdnBinding.docId,\n layerName: this.cdnBinding.layerName,\n cdn: this.cdnBinding.cdn,\n });\n return {\n url: applied.url,\n extraHeader: applied.routedToCdn && applied.authHeader ? applied.authHeader : null,\n routedToCdn: applied.routedToCdn,\n };\n }\n\n private async throwFromBody(res: Response): Promise<never> {\n let payload: unknown;\n try {\n payload = await res.json();\n } catch {\n payload = null;\n }\n const code = mapStatusToCode(res.status);\n if (payload && typeof payload === 'object' && 'error' in payload) {\n const inner = (payload as { error: unknown }).error;\n const parsed = trySerialized(inner);\n if (parsed) throw new EngineError(parsed.code, parsed.message, { details: parsed.details });\n const msg =\n typeof inner === 'object' && inner && 'message' in inner\n ? String((inner as { message: unknown }).message)\n : `HTTP ${res.status}`;\n throw new EngineError(code, msg, { details: { status: res.status } });\n }\n throw new EngineError(code, `HTTP ${res.status}`, { details: { status: res.status } });\n }\n}\n\nfunction mapStatusToCode(status: number): EngineErrorCode {\n if (status === 401) return EngineErrorCode.Unauthenticated;\n if (status === 403) return EngineErrorCode.Forbidden;\n if (status === 409) return EngineErrorCode.WeakAnnotationSessionConflict;\n if (status === 404) return EngineErrorCode.NotFound;\n if (status === 422) return EngineErrorCode.DocOpenFailed;\n if (status === 499) return EngineErrorCode.Aborted;\n if (status === 400) return EngineErrorCode.InvalidArg;\n return EngineErrorCode.Unknown;\n}\n\nfunction trySerialized(value: unknown): SerializedEngineError | null {\n const result = EngineErrorPayloadSchema.safeParse(value);\n return result.success ? result.data : null;\n}\n\nconst RETRYABLE_503 = new Set(['EngineBusy', 'EngineRestarting']);\n\nfunction isStreamBody(body: BodyInit | null): boolean {\n return typeof ReadableStream !== 'undefined' && body instanceof ReadableStream;\n}\n\n/** Read the error code from a 503 body without consuming the response. */\nasync function peekErrorCode(res: Response): Promise<string | null> {\n try {\n const payload = (await res.clone().json()) as { error?: { code?: unknown } } | null;\n const code = payload?.error?.code;\n return typeof code === 'string' ? code : null;\n } catch {\n return null;\n }\n}\n\nfunction sleepRacingAbort(ms: number, signal: AbortSignal | null): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new AbortError(signal.reason ?? 'aborted'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(new AbortError(signal?.reason ?? 'aborted'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type DocumentHandle,\n type Engine,\n type OpenInput,\n type OpenOptions,\n} from '@embedpdf/engine-core/runtime';\nimport { DEFAULT_LAYER_NAME, DocumentHeadSchema, wirePaths } from '@embedpdf/engine-core/wire';\nimport { generateUuid } from '@embedpdf/engine-services';\n\nimport { CloudDocumentHandle } from './document/CloudDocumentHandle';\nimport { CloudDocumentSecurityService } from './document/CloudDocumentSecurityService';\nimport { engineErrorFromShareExchange, ShareExchangeError, shareSessionSource } from './share';\nimport { decodeUnverifiedClaims } from './transport/decodeUnverifiedClaims';\nimport { HttpClient, type HttpClientOptions } from './transport/HttpClient';\n\nexport interface CloudEngineOptions extends HttpClientOptions {}\n\n/**\n * Cloud engine: speaks the same Engine interface as @embedpdf/engine\n * but routes everything through HTTPS to a remote @cloudpdf/server (or\n * CloudPDF SaaS). Identical observable contract; only the transport differs.\n */\nexport class CloudEngine implements Engine {\n static fromOptions(opts: CloudEngineOptions): CloudEngine {\n // One identity per engine instance: it stamps local events' origins AND\n // travels as X-Engine-Session-Id so the server can mark this instance's\n // audit rows — the SSE stream drops those echoes (exactly-once events).\n const sessionId = `cloud:${generateUuid()}`;\n return new CloudEngine(new HttpClient({ ...opts, sessionId }), sessionId);\n }\n\n private destroyed = false;\n\n private constructor(\n private readonly http: HttpClient,\n /** This engine instance's identity on every event's `origin.sessionId`. */\n private readonly sessionId: string,\n ) {}\n\n open(input: OpenInput, options?: OpenOptions): AbortablePromise<DocumentHandle> {\n if (this.destroyed) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.RuntimeUnavailable, 'engine destroyed'),\n );\n }\n // Cloud reads scope + identity from the doc-scoped JWT — `options.scope`\n // and `options.identity` are engine-local concepts and are intentionally\n // ignored here. Same `OpenOptions` type for both engines is what makes\n // SDK code portable; the JWT is the authority cloud-side.\n void options?.scope;\n void options?.identity;\n\n // Presence-based precedence, same rule the local engine documents: an\n // options.password key wins (even explicitly null), else input.password.\n // For 'share' inputs `input.password` is still the PDF password — the\n // grant passphrase travels separately as `input.sharePassword`.\n const effectivePassword =\n options && 'password' in options ? (options.password ?? null) : (input.password ?? null);\n\n if (input.kind === 'share') {\n // Open by public share token: exchange `shr_…` for a short-lived\n // doc-scoped session JWT, then delegate to the 'token' arm — the\n // handle binds to a SELF-RENEWING source, so revoking or editing\n // the share retargets this open at the next renewal. The exchange\n // rides the engine's own transport config (baseUrl + fetch);\n // exchange failures surface as EngineErrors on open AND on every\n // later renewal (RPCs, SSE reconnects), never as raw\n // ShareExchangeErrors.\n const raw = shareSessionSource(this.http.baseUrl, input.shareToken, {\n ...(input.sharePassword !== undefined ? { password: input.sharePassword } : {}),\n fetch: this.http.fetchImpl,\n });\n const token = async () => {\n try {\n return await raw();\n } catch (error) {\n throw error instanceof ShareExchangeError ? engineErrorFromShareExchange(error) : error;\n }\n };\n return this.open({ kind: 'token', token, password: input.password ?? null }, options);\n }\n\n if (input.kind === 'token') {\n // Open by doc-scoped JWT. We never verify the token SDK-side\n // (server is the verifier of record); we just decode the\n // unsigned payload to learn `doc_id`, then route to /head with\n // the per-open bearer. The resulting handle owns its own\n // scoped HttpClient — every subsequent RPC carries this\n // token, NOT the engine-level one, so one engine can hold\n // many handles each with a different bearer.\n const tokenSource = input.token;\n return AbortablePromise.run<DocumentHandle>(async (signal) => {\n const docHttp = this.http.withToken(tokenSource);\n const token = await docHttp.currentToken();\n const claims = decodeUnverifiedClaims(token);\n const docId = claims.doc_id;\n if (typeof docId !== 'string' || docId.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'cloud engine: token has no doc_id claim — mint a doc-scoped JWT',\n );\n }\n const layerName =\n typeof claims.layer_name === 'string' && claims.layer_name.length > 0\n ? claims.layer_name\n : DEFAULT_LAYER_NAME;\n const head = await docHttp.getJson(\n wirePaths.layerHead(docId, layerName),\n (raw) => DocumentHeadSchema.parse(raw),\n signal,\n );\n const handle = new CloudDocumentHandle(\n docHttp,\n head.id,\n layerName,\n head,\n token,\n this.sessionId,\n );\n await maybeAutoEstablishAccess(handle, head, signal, effectivePassword);\n return handle;\n });\n }\n\n if (input.kind === 'id') {\n // Open by docId using the engine-level token (typical: a\n // tenant JWT). The caller can override per-open by setting\n // `input.token`; the resulting handle then carries that\n // override for all of its RPCs.\n const id = input.id;\n const docHttp = input.token ? this.http.withToken(input.token) : this.http;\n return AbortablePromise.run<DocumentHandle>(async (signal) => {\n let layerName = input.layerName ?? DEFAULT_LAYER_NAME;\n // Resolve the bearer once so we have it for the layer-name\n // claim AND for the security service's local-fallback scope/\n // identity. May be null when the engine has no token at all\n // (caller invokes /head anonymously — server will reject).\n let resolvedToken: string | null = null;\n try {\n resolvedToken = await docHttp.currentToken();\n } catch {\n resolvedToken = null;\n }\n if (!input.layerName && resolvedToken) {\n const claims = decodeUnverifiedClaims(resolvedToken);\n if (typeof claims.layer_name === 'string' && claims.layer_name.length > 0) {\n layerName = claims.layer_name;\n }\n }\n const head = await docHttp.getJson(\n wirePaths.layerHead(id, layerName),\n (raw) => DocumentHeadSchema.parse(raw),\n signal,\n );\n const handle = new CloudDocumentHandle(\n docHttp,\n head.id,\n layerName,\n head,\n resolvedToken,\n this.sessionId,\n );\n await maybeAutoEstablishAccess(handle, head, signal, effectivePassword);\n return handle;\n });\n }\n\n void options;\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `cloud engine supports OpenInput.kind === 'token', 'id', or 'share' (got '${(input as { kind?: string }).kind}')`,\n ),\n );\n }\n\n destroy(): AbortablePromise<void> {\n if (this.destroyed) return AbortablePromise.resolveValue<void>(undefined);\n this.destroyed = true;\n return AbortablePromise.resolveValue<void>(undefined);\n }\n}\n\n/**\n * Post-/head access establishment, in two layers:\n *\n * 1. **Supplied password** — a password given at open is always TRIED\n * (PDFium parity: the local engine feeds it to the loader no matter\n * what). Two triggers, because `/head` only carries the `password`\n * reason when a password is needed to READ:\n * - `reasons` has `'password'` → required-to-read case\n * - `head.permissions.canUpgradeToOwner` → permission-only encrypted\n * doc; the password can still upgrade to owner. Skipping this arm\n * would silently drop supplied OWNER passwords — and diverge from\n * the local engine on identical input.\n * Outcomes follow \"a password failure may only block what the password\n * was needed for\": a rejection in the required case leaves the handle\n * locked (the caller's prompt takes over, showing \"incorrect\"); in the\n * upgrade case the document stays readable and the failure is\n * non-fatal. The one /access POST also installs the CDN binding, so a\n * successful unlock covers the `password + cdn` combined case.\n *\n * 2. **CDN-only** — unchanged: `/access` without a password, transparently.\n * A required password with NO supplied password never auto-calls; the\n * dev prompts and `unlock()` runs the same POST.\n *\n * Non-password /access failures never break `open()` (the first real\n * request still tries origin, where the JWT check produces a regular\n * Forbidden) — but they are also never mistaken for a wrong password:\n * only a DocPasswordRequired/Incorrect rejection means \"wrong password\".\n */\nasync function maybeAutoEstablishAccess(\n handle: CloudDocumentHandle,\n head: {\n access: { required: boolean; reasons: ReadonlyArray<string> };\n permissions: { canUpgradeToOwner: boolean };\n },\n signal: AbortSignal,\n password: string | null,\n): Promise<void> {\n const reasons = new Set(head.access.reasons);\n // CloudDocumentSecurityService exposes `establishAccess()` — the\n // no-password sibling of `unlock()`. The public DocumentSecurityService\n // interface doesn't carry it (unlock = user action), but every\n // CloudDocumentHandle's `.security` is a CloudDocumentSecurityService.\n const security = handle.security as CloudDocumentSecurityService;\n\n const tryPassword =\n password != null && (reasons.has('password') || head.permissions.canUpgradeToOwner);\n if (tryPassword) {\n const unlocked = await settleLinked(security.unlock({ password, mode: 'any' }), signal);\n if (unlocked) return; // /access succeeded — CDN binding installed too\n // Rejected or failed: in the required case the handle stays locked and\n // the caller's password prompt takes over (retrying re-POSTs /access);\n // in the upgrade case the document is readable regardless — fall\n // through so a CDN-only establishment still happens.\n if (reasons.has('password')) return;\n }\n\n if (!head.access.required) return;\n if (reasons.has('password')) return; // wait for explicit unlock()\n if (!reasons.has('cdn')) return; // nothing actionable for the SDK\n await settleLinked(security.establishAccess(), signal);\n}\n\n/** Await an /access attempt with open()-abort linkage. Returns whether it\n * succeeded; failures are contained (see maybeAutoEstablishAccess). */\nasync function settleLinked(\n pending: ReturnType<CloudDocumentSecurityService['unlock']>,\n signal: AbortSignal,\n): Promise<boolean> {\n const onAbort = () => pending.abort(signal.reason ?? new Error('aborted'));\n if (signal.aborted) onAbort();\n else signal.addEventListener('abort', onAbort, { once: true });\n try {\n await pending;\n return true;\n } catch {\n return false;\n } finally {\n signal.removeEventListener('abort', onAbort);\n }\n}\n","/**\n * @cloudpdf/engine - Engine v3 cloud client.\n *\n * Implements the same {@link Engine} interface as `@embedpdf/engine` but\n * routes calls to a remote `@cloudpdf/server` over HTTP. Same observable\n * contract: {@link AbortablePromise}-based, EngineError-coded, parity-tested\n * with `runMetadataConformance`.\n */\nexport { CloudEngine } from './CloudEngine';\nexport type { CloudEngineOptions } from './CloudEngine';\nexport { CloudDocumentHandle } from './document/CloudDocumentHandle';\nexport { CloudMetadataService } from './document/CloudMetadataService';\nexport { CloudDocumentAnnotationsService } from './document/CloudDocumentAnnotationsService';\nexport { CloudDocumentPagesService } from './document/CloudDocumentPagesService';\nexport { CloudPageHandle } from './document/CloudPageHandle';\nexport { CloudPageAnnotationsService } from './document/CloudPageAnnotationsService';\nexport { CloudPageGeometryService } from './document/CloudPageGeometryService';\nexport { CloudPageRenderService } from './document/CloudPageRenderService';\nexport { HttpClient } from './transport/HttpClient';\nexport type { HttpClientOptions } from './transport/HttpClient';\nexport { decodeUnverifiedClaims } from './transport/decodeUnverifiedClaims';\nexport type { UnverifiedClaims } from './transport/decodeUnverifiedClaims';\nexport {\n exchangeShareToken,\n shareSessionSource,\n ShareExchangeError,\n engineErrorFromShareExchange,\n} from './share';\nexport type { ShareSession, ShareExchangeOptions } from './share';\n\nimport { CloudEngine, type CloudEngineOptions } from './CloudEngine';\n\nexport function createCloudEngine(opts: CloudEngineOptions): CloudEngine {\n return CloudEngine.fromOptions(opts);\n}\n\n/**\n * Create a cloud {@link CloudEngine} — the drop-in counterpart of\n * `localEngine()`, so swapping local for cloud is a one-import change.\n *\n * Synchronous and cheap: no WASM to compile, no worker to spawn — the engine\n * holds an HTTP client and nothing else. Like `localEngine()`, the returned\n * instance is yours (call `destroy()` when done, usually never for a\n * module-scope singleton); pass a thunk (`engine={() => cloudEngine(...)}`)\n * to let a `<Viewer>` own the lifetime instead.\n *\n * Note the deliberate asymmetry with `localEngine()`: there is no `fonts`\n * option. Fallback fonts are a SERVER policy on the cloud (`Engine.fonts` is\n * `undefined` cloud-side), so they cannot be configured from the client. This\n * is the local-vs-cloud split, surfaced in the API.\n *\n * ```ts\n * const engine = cloudEngine({ baseUrl: 'https://pdf.example.com', token });\n * <Viewer engine={engine} plugins={[stagePlugin(), renderPlugin()]} />\n * ```\n */\nexport function cloudEngine(opts: CloudEngineOptions): CloudEngine {\n return CloudEngine.fromOptions(opts);\n}\n\n// Re-export the shared engine runtime surface so consumers import every\n// public type and primitive from a single `@cloudpdf/engine` entrypoint\n// instead of reaching into the transitive `@embedpdf/engine-core` dep.\nexport {\n AbortablePromise,\n AbortError,\n EngineError,\n EngineErrorCode,\n} from '@embedpdf/engine-core/runtime';\nexport type {\n Engine,\n EngineFactory,\n DocumentHandle,\n DocumentCapabilities,\n PageHandle,\n OpenInput,\n OpenInputShare,\n OpenOptions,\n TokenSource,\n MetadataService,\n DocumentPagesService,\n DocumentAnnotationsService,\n PageAnnotationsService,\n PageTextService,\n PageGeometryService,\n PageRenderService,\n DocumentSecurityService,\n DocumentSecurityState,\n DocumentUnlockInput,\n DocumentUnlockResult,\n DocumentAccessInfo,\n DocumentIdentity,\n PdfSaveMode,\n} from '@embedpdf/engine-core/runtime';\n"],"mappings":";;;;;;;;;;;;;;AAWA,SAAgB,gBACd,UACA,QACS;CACT,MAAM,SAAS,SAAS;CACxB,IAAI,CAAC,QAAQ,OAAO;CACpB,OAAO,OAAO,OAAO,UAAU,OAAO,WAAW,MAAM;AACzD;;;ACLA,IAAa,8BAAb,MAA2E;CACzE,YACE,MACA,OACA,WACA,UACA,UACA;EALiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;CAChB;CAEH,OAAkD;EAChD,IAAI,KAAK,SAAS,GAChB,OAAOA,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,KAAK,WAC3B,KAAK,KAAK,mBACR,OAAO,kBAAkB;GACvB,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,aAAa;GAItD,OAAO,gBAAgB,UAAU,CAAC,SAAS,CAAC,IACxCG,2BAAAA,UAAU,WAAW,KAAK,OAAO,SAAS,cAAc,IACxDA,2BAAAA,UAAU,aAAa,KAAK,OAAO,KAAK,WAAW,SAAS,cAAc;EAChF,IACC,QAAQC,2BAAAA,8BAA8B,MAAM,GAAG,GAChD,OAAO,kBAAkB;GACvB,MAAM,KAAK,SAAS,QAAQ,aAAa;EAC3C,GACA,MACF,CACF;CACF;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrBA,MAAM,yBAAyB;AAE/B,IAAa,kCAAb,MAAmF;CACjF,YACE,MACA,OACA,WACA,UACA,UACA;EALiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;CAChB;;;;;;;;;;CAWH,aAA+D;EAC7D,IAAI,KAAK,SAAS,GAChB,OAAOC,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAoC,OAAO,WAAW;GAC5E,KAAK,IAAI,UAAU,IAAK,WAAW;IACjC,MAAM,WACJ,YAAY,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,MAAM,KAAK,SAAS,QAAQ,MAAM;IACtF,IAAI;KACF,OAAO,MAAM,KAAK,WAAW,UAAU,MAAM;IAC/C,SAAS,KAAK;KACZ,IAAI,CAACC,8BAAAA,YAAY,GAAG,KAAKC,8BAAAA,gBAAgB,QAAQ,KAAK,WAAW,wBAC/D,MAAM;IAGV;GACF;EACF,CAAC;CACH;;;;;;CAOA,MAAc,WACZ,UACA,QACyC;EACzC,MAAM,OAAO,gBAAgB,UAAU,CAAC,aAAa,CAAC,IAClDC,2BAAAA,UAAU,kBAAkB,KAAK,OAAO,SAAS,kBAAkB,IACnEA,2BAAAA,UAAU,oBAAoB,KAAK,OAAO,KAAK,WAAW,SAAS,kBAAkB;EACzF,MAAM,OAAO,MAAM,KAAK,KAAK,QAC3B,OACC,QAAQC,2BAAAA,qCAAqC,MAAM,GAAG,GACvD,MACF;EACA,OAAO;GAAE,GAAG;GAAM,WAAW,KAAK,aAAa,SAAS;EAAU;CACpE;CAEA,QAAQ,kBAAkF;EACxF,IAAI,KAAK,SAAS,GAChB,OAAOJ,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAIF,OAAOF,8BAAAA,iBAAiB,KAAiC,WACvD,KAAK,KAAK,mBACR,OAAO,MAAM,KAAK,kBAAkB,MAAM,KAAK,SAAS,IAAI,CAAC,GAAG,gBAAgB,IAC/E,QAAQK,2BAAAA,iCAAiC,MAAM,GAAG,GACnD,OAAO,MAAM;GACX,MAAM,KAAK,SAAS,QAAQ,CAAC;EAC/B,GACA,MACF,CACF;CACF;;;;CAKA,WAAmB,UAA4B,MAA4B;EACzE,OAAO,gBAAgB,UAAU,CAAC,aAAa,CAAC,IAC5CF,2BAAAA,UAAU,mBACR,KAAK,OACL,KAAK,MAAM,kBACX,KAAK,MAAM,iBACb,IACAA,2BAAAA,UAAU,qBACR,KAAK,OACL,KAAK,WACL,KAAK,MAAM,kBACX,KAAK,MAAM,iBACb;CACN;CAEA,kBACE,UACA,kBACQ;EACR,MAAM,OAAO,SAAS,MAAM,MAAM,MAAM,EAAE,MAAM,qBAAqB,gBAAgB;EACrF,IAAI,CAAC,MACH,MAAM,IAAIF,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,iBAAiB,eAAe,KAAK,OACrE;EAEF,OAAO,KAAK,WAAW,UAAU,IAAI;CACvC;CAEA,cACE,mBAC6C;EAC7C,IAAI,KAAK,SAAS,GAChB,OAAOF,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAA+B,OAAO,WAAW;GACvE,MAAM,WAAW,MAAM,KAAK,KAAK,SAC/BG,2BAAAA,UAAU,2BAA2B,KAAK,OAAO,KAAK,SAAS,GAC/D,EAAE,kBAAkB,IACnB,QAAQG,2BAAAA,oCAAoC,MAAM,GAAG,GACtD,MACF;GACA,OAAO,IAAI,+BACT,KAAK,MACL,KAAK,OACL,KAAK,iBACC,KAAK,SAAS,GACpB,QACF;EACF,CAAC;CACH;AAEF;AAEA,IAAM,iCAAN,MAA0E;CAIxE,YACE,MACA,OACA,WACA,UACA,UACA;EALiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,WAAA;EAPX,gBAAA,MAAA,YAAA,KAAA,CAAA;EACA,gBAAA,MAAA,YAAW,KAAA;EASjB,KAAK,WAAW;CAClB;CAEA,IAAI,KAAa;EACf,OAAO,KAAK,SAAS;CACvB;CAEA,IAAI,YAAoB;EACtB,OAAO,KAAK,SAAS;CACvB;CAEA,IAAI,sBAA8B;EAChC,OAAO,KAAK,SAAS;CACvB;CAEA,IAAI,oBAAiD;EACnD,OAAO,KAAK,SAAS;CACvB;CAEA,OAAO,kBAA6C;EAClD,OAAO,KAAK,SAAS,kBAAkB,SAAS,gBAAgB;CAClE;CAEA,YAAY,mBAAwE;EAClF,IAAI,KAAK,SAAS,KAAK,KAAK,UAC1B,OAAON,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,2BAA2B,KAAK,GAAG,WAAW,CAC5F;EAEF,OAAOF,8BAAAA,iBAAiB,IAAU,OAAO,WAAW;GAClD,KAAK,WAAW,MAAM,KAAK,KAAK,SAC9BG,2BAAAA,UAAU,gCAAgC,KAAK,OAAO,KAAK,WAAW,KAAK,EAAE,GAC7E,EAAE,kBAAkB,IACnB,QAAQG,2BAAAA,oCAAoC,MAAM,GAAG,GACtD,MACF;EACF,CAAC;CACH;CAEA,YAAoC;EAClC,IAAI,KAAK,SAAS,KAAK,KAAK,UAC1B,OAAON,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,2BAA2B,KAAK,GAAG,WAAW,CAC5F;EAEF,OAAOF,8BAAAA,iBAAiB,IAAU,OAAO,WAAW;GAClD,KAAK,WAAW,MAAM,KAAK,KAAK,SAC9BG,2BAAAA,UAAU,oCAAoC,KAAK,OAAO,KAAK,WAAW,KAAK,EAAE,GACjF,CAAC,IACA,QAAQG,2BAAAA,oCAAoC,MAAM,GAAG,GACtD,MACF;EACF,CAAC;CACH;CAEA,UAAkC;EAChC,IAAI,KAAK,UACP,OAAON,8BAAAA,iBAAiB,aAAa,KAAA,CAAS;EAEhD,KAAK,WAAW;EAChB,OAAOA,8BAAAA,iBAAiB,KAAW,WACjC,KAAK,KAAK,YACRG,2BAAAA,UAAU,kCAAkC,KAAK,OAAO,KAAK,WAAW,KAAK,EAAE,GAC/E,MACF,CACF;CACF;AACF;;;;;;;;;;;;AC1OA,SAAgB,kBAAkB,MAAe,WAAsC;CACrF,MAAM,OAAO,IAAI,SAAS;CAC1B,KAAK,OAAO,QAAQ,KAAK,UAAU,IAAI,CAAC;CACxC,KAAK,MAAM,CAAC,KAAK,aAAa,OAAO,QAAQ,SAAS,GACpD,KAAK,OACH,YAAY,OACZ,IAAI,KAAK,CAAC,SAAS,KAAK,GAAG,EAAE,MAAM,SAAS,YAAY,2BAA2B,CAAC,GACpF,SAAS,QAAQ,GACnB;CAEF,OAAO;AACT;AAEA,SAAgB,aAAa,WAAqC;CAChE,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,SAAS;AACzC;;;;;ACfA,MAAM,mBAAmB;;;;;;;;;AAUzB,SAAgB,uBAAuB,MAA2C;CAChF,MAAM,cAAc,KAAK,QAAQ,IAAI,gBAAgB;CACrD,IAAI,gBAAgB,MAClB,MAAM,IAAII,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,+BAA+B,iBAAiB,QAClD;CAEF,IAAI;CACJ,IAAI;EACF,QAAA,GAAA,2BAAA,gBAAA,CAAuB,WAAW;CACpC,SAAS,KAAK;EACZ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,aAAa,iBAAiB,WAAY,KAAe,WAAW,OACpE,EAAE,OAAO,IAAI,CACf;CACF;CACA,MAAM,WAAW,KAAK,QAAQ,IAAI,cAAc;CAChD,OAAO;EACL,OAAO,KAAK;EACZ;EACA,GAAI,aAAa,OAAO,EAAE,SAAS,IAAI,CAAC;CAC1C;AACF;;;;ACjBA,MAAM,yBAAyBC,2BAAAA,uBAAuB,MAAM;;;;;;;;;;AAW5D,IAAa,kCAAb,MAAmF;CACjF,YACE,MACA,OACA,WACA,UACA,UACA,WACA;EANiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;EACA,KAAA,YAAA;CAChB;;;;;;;;CASH,OAA6C;EAC3C,IAAI,KAAK,SAAS,GAChB,OAAOC,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAwB,OAAO,WAAW;GAChE,MAAM,YAAY,OAAO,MAAoC;IAC3D,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,CAAC;IAI1C,OAAO,gBAAgB,UAAU,CAAC,aAAa,CAAC,IAC5CG,2BAAAA,UAAU,eAAe,KAAK,OAAO,SAAS,kBAAkB,IAChEA,2BAAAA,UAAU,iBAAiB,KAAK,OAAO,KAAK,WAAW,SAAS,kBAAkB;GACxF;GACA,OAAO,KAAK,KAAK,mBACf,YACC,QAAQ,uBAAuB,MAAM,GAAG,GACzC,OAAO,MAAM;IACX,MAAM,KAAK,SAAS,QAAQ,CAAC;GAC/B,GACA,MACF;EACF,CAAC;CACH;;;;;;;CAQA,SAAS,KAA2D;EAClE,IAAI,KAAK,SAAS,GAChB,OAAOH,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAuB,OAAO,WAAW;GAC/D,MAAM,YAAY,OAAO,MAAoC;IAC3D,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,CAAC;IAE1C,OAAO,gBAAgB,UAAU,CAAC,aAAa,CAAC,IAC5CG,2BAAAA,UAAU,kBAAkB,KAAK,OAAO,IAAI,KAAK,SAAS,kBAAkB,IAC5EA,2BAAAA,UAAU,oBACR,KAAK,OACL,KAAK,WACL,IAAI,KACJ,SAAS,kBACX;GACN;GAQA,OAAO,uBAAuB,MAPX,KAAK,KAAK,mBAC3B,WACA,OAAO,MAAM;IACX,MAAM,KAAK,SAAS,QAAQ,CAAC;GAC/B,GACA,MACF,CACkC;EACpC,CAAC;CACH;;;;;;;CAQA,OAAO,MAAsE;EAC3E,IAAI,KAAK,SAAS,GAChB,OAAOH,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAA4B,OAAO,WAAW;GACpE,MAAM,EAAE,UAAU,aAAa,OAAA,GAAA,8BAAA,8BAAA,CAAoC,MAAM,IAAI;GAC7E,MAAM,SAAS,MAAM,KAAK,KAAK,kBAC7BG,2BAAAA,UAAU,2BAA2B,KAAK,OAAO,KAAK,SAAS,GAC/D,kBAAkB,UAAU,EAAE,IAAI,SAAS,CAAC,IAC3C,QAAQC,2BAAAA,6BAA6B,MAAM,GAAG,GAC/C,MACF;GAMA,IAAI,OAAO,OAAO,KAAK,SAAS,iBAAiB,OAAO,KAAK;GAC7D,KAAK,UAAU,aAAa;IAAE,MAAM;IAAsB,GAAG;GAAO,CAAC;GACrE,OAAO;EACT,CAAC;CACH;;CAGA,OAAO,KAAgE;EACrE,IAAI,KAAK,SAAS,GAChB,OAAOJ,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAA4B,OAAO,WAAW;GACpE,MAAM,SAAS,MAAM,KAAK,KAAK,WAC7BG,2BAAAA,UAAU,oBAAoB,KAAK,OAAO,KAAK,WAAW,IAAI,GAAG,IAChE,QAAQE,2BAAAA,6BAA6B,MAAM,GAAG,GAC/C,MACF;GAEA,IAAI,OAAO,OAAO,KAAK,SAAS,iBAAiB,OAAO,KAAK;GAC7D,KAAK,UAAU,aAAa;IAAE,MAAM;IAAsB,GAAG;GAAO,CAAC;GACrE,OAAO;EACT,CAAC;CACH;AACF;;;;;ACvHA,MAAM,sBAAsD;CAC1D,KAAK;CACL,MAAM;AACR;;;;;;;;;;;;AAaA,IAAa,4BAAb,MAAuE;CACrE,YACE,MACA,OACA,WACA,UACA,UACA,WACA;EANiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;EACA,KAAA,YAAA;CAChB;CAEH,OAAuC;EACrC,MAAM,WAAW,KAAK,eAA6B;EACnD,IAAI,UAAU,OAAO;EACrB,OAAOC,8BAAAA,iBAAiB,KAAmB,WACzC,KAAK,KAAK,QACRC,2BAAAA,UAAU,UAAU,KAAK,OAAO,KAAK,SAAS,IAC7C,QAAQC,2BAAAA,mBAAmB,MAAM,GAAG,GACrC,MACF,CACF;CACF;CAEA,IAAI,KAAmD;EACrD,MAAM,WAAW,KAAK,eAA6B;EACnD,IAAI,UAAU,OAAO;EACrB,OAAOF,8BAAAA,iBAAiB,KAAmB,WACzC,KAAK,KAAK,QACRC,2BAAAA,UAAU,oBAAoB,KAAK,OAAO,KAAK,YAAA,GAAA,8BAAA,kBAAA,CAA6B,GAAG,CAAC,IAC/E,QAAQE,2BAAAA,mBAAmB,MAAM,GAAG,GACrC,MACF,CACF;CACF;CAEA,SAAS,KAAmB,OAA6D;EACvF,MAAM,WAAW,KAAK,eAAmC;EACzD,IAAI,UAAU,OAAO;EACrB,OAAOH,8BAAAA,iBAAiB,IAAwB,OAAO,WAAW;GAChE,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BC,2BAAAA,UAAU,oBAAoB,KAAK,OAAO,KAAK,YAAA,GAAA,8BAAA,kBAAA,CAA6B,GAAG,CAAC,GAChF,EAAE,MAAM,IACP,QAAQG,2BAAAA,yBAAyB,MAAM,GAAG,GAC3C,MACF;GACA,OAAO,KAAK,eAAe,QAAQ,mBAAmB;EACxD,CAAC;CACH;CAEA,MAAM,KAAyD;EAC7D,MAAM,WAAW,KAAK,eAAmC;EACzD,IAAI,UAAU,OAAO;EACrB,OAAOJ,8BAAAA,iBAAiB,IAAwB,OAAO,WAAW;GAChE,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BC,2BAAAA,UAAU,oBAAoB,KAAK,OAAO,KAAK,YAAA,GAAA,8BAAA,kBAAA,CAA6B,GAAG,CAAC,GAChF,CAAC,IACA,QAAQG,2BAAAA,yBAAyB,MAAM,GAAG,GAC3C,MACF;GACA,OAAO,KAAK,eAAe,QAAQ,mBAAmB;EACxD,CAAC;CACH;CAEA,aAAa,SAA4D;EACvE,MAAM,WAAW,KAAK,eAAkC;EACxD,IAAI,UAAU,OAAO;EACrB,OAAOJ,8BAAAA,iBAAiB,IAAuB,OAAO,WAAW;GAC/D,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BC,2BAAAA,UAAU,iBAAiB,KAAK,OAAO,KAAK,SAAS,GACrD,EAAE,QAAQ,IACT,QAAQI,2BAAAA,wBAAwB,MAAM,GAAG,GAC1C,MACF;GAGA,IAAI,OAAO,SAAS,MAAM,OAAO;GACjC,KAAK,SAAS,MAAM,OAAO,MAAM,CAAC,aAAa,CAAC;GAChD,KAAK,UAAU,aAAa;IAAE,MAAM;IAAuB,GAAG;GAAO,CAAC;GACtE,OAAO;EACT,CAAC;CACH;CAEA,WAAW,SAAyB,QAA0C;EAC5E,MAAM,WAAW,KAAK,eAA+B;EACrD,IAAI,UAAU,OAAO;EACrB,OAAOL,8BAAAA,iBAAiB,IAAoB,OAAO,WAAW;GAK5D,OAAO;IAAE;IAAQ,OAAA,MAJG,KAAK,KAAK,SAC5BC,2BAAAA,UAAU,cAAc,KAAK,OAAO,KAAK,WAAW,MAAM,GAC1D,MACF;GACuB;EACzB,CAAC;CACH;CAEA,WACE,MACA,QACoC;EACpC,MAAM,WAAW,KAAK,eAAiC;EACvD,IAAI,UAAU,OAAO;EACrB,MAAM,QAAQ,gBAAgB,cAAc,IAAI,WAAW,IAAI,IAAI;EACnE,OAAOD,8BAAAA,iBAAiB,IAAsB,OAAO,WAAW;GAC9D,MAAM,SAAS,MAAM,KAAK,KAAK,cAC7BC,2BAAAA,UAAU,cAAc,KAAK,OAAO,KAAK,WAAW,MAAM,GAC1D,OACA,SAAS,oBAAoB,UAAU,6BACtC,QAAQK,2BAAAA,uBAAuB,MAAM,GAAG,GACzC,MACF;GACA,OAAO,KAAK,eAAe,QAAQ,eAAe;EACpD,CAAC;CACH;CAEA,YAAY,OAAgE;EAC1E,MAAM,WAAW,KAAK,eAAsC;EAC5D,IAAI,UAAU,OAAO;EACrB,OAAON,8BAAAA,iBAAiB,IAA2B,OAAO,WAAW;GACnE,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BC,2BAAAA,UAAU,gBAAgB,KAAK,OAAO,KAAK,SAAS,GACpD,QACC,QAAQM,2BAAAA,4BAA4B,MAAM,GAAG,GAC9C,MACF;GACA,OAAO,KAAK,eAAe,QAAQ,mBAAmB;EACxD,CAAC;CACH;CAEA,YAAY,KAAmB,OAAgE;EAC7F,MAAM,WAAW,KAAK,eAAsC;EAC5D,IAAI,UAAU,OAAO;EACrB,OAAOP,8BAAAA,iBAAiB,IAA2B,OAAO,WAAW;GACnE,MAAM,SAAS,MAAM,KAAK,KAAK,UAC7BC,2BAAAA,UAAU,oBAAoB,KAAK,OAAO,KAAK,YAAA,GAAA,8BAAA,kBAAA,CAA6B,GAAG,CAAC,GAChF,QACC,QAAQO,2BAAAA,4BAA4B,MAAM,GAAG,GAC9C,MACF;GACA,OAAO,KAAK,eAAe,QAAQ,mBAAmB;EACxD,CAAC;CACH;CAEA,uBACE,KACA,YACyC;EACzC,MAAM,WAAW,KAAK,eAAsC;EAC5D,IAAI,UAAU,OAAO;EACrB,OAAOR,8BAAAA,iBAAiB,IAA2B,OAAO,WAAW;GACnE,MAAM,QAAQ,IAAI,YAAY,WAAW,IAAI,UAAU;GACvD,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,WAAW,GAAG;GACxC,MAAM,OAAO,kBACX;IAAE,UAAU;IAAM,WAAW,WAAW,aAAa;GAAE,GACvD,EAAE,IAAI;IAAE;IAAO,UAAU;IAAmB,MAAM;GAAiB,EAAE,CACvE;GACA,MAAM,SAAS,MAAM,KAAK,KAAK,kBAC7BC,2BAAAA,UAAU,kCAAkC,KAAK,OAAO,KAAK,YAAA,GAAA,8BAAA,kBAAA,CAA6B,GAAG,CAAC,GAC9F,OACC,QAAQO,2BAAAA,4BAA4B,MAAM,GAAG,GAC9C,MACF;GACA,OAAO,KAAK,eAAe,QAAQ,mBAAmB;EACxD,CAAC;CACH;CAEA,YAAY,KAA4D;EACtE,MAAM,WAAW,KAAK,eAAsC;EAC5D,IAAI,UAAU,OAAO;EACrB,OAAOR,8BAAAA,iBAAiB,IAA2B,OAAO,WAAW;GACnE,MAAM,SAAS,MAAM,KAAK,KAAK,WAC7BC,2BAAAA,UAAU,oBAAoB,KAAK,OAAO,KAAK,YAAA,GAAA,8BAAA,kBAAA,CAA6B,GAAG,CAAC,IAC/E,QAAQQ,2BAAAA,4BAA4B,MAAM,GAAG,GAC9C,MACF;GACA,OAAO,KAAK,eAAe,QAAQ,mBAAmB;EACxD,CAAC;CACH;CAEA,aACE,KACA,QACA,SACwC;EACxC,MAAM,WAAW,KAAK,eAAqC;EAC3D,IAAI,UAAU,OAAO;EACrB,MAAM,UAAU,SAAS;EACzB,OAAOT,8BAAAA,iBAAiB,IAA0B,OAAO,WAAW;GAClE,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BC,2BAAAA,UAAU,sBAAsB,KAAK,OAAO,KAAK,YAAA,GAAA,8BAAA,kBAAA,CAA6B,GAAG,CAAC,GAClF;IAAE;IAAQ,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;GAAG,IACzC,QAAQS,2BAAAA,2BAA2B,MAAM,GAAG,GAC7C,MACF;GACA,OAAO,KAAK,eAAe,QAAQ,qBAAqB;EAC1D,CAAC;CACH;CAEA,aAAa,KAAmB,QAA+D;EAC7F,MAAM,WAAW,KAAK,eAAqC;EAC3D,IAAI,UAAU,OAAO;EACrB,OAAOV,8BAAAA,iBAAiB,IAA0B,OAAO,WAAW;GAClE,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BC,2BAAAA,UAAU,4BAA4B,KAAK,OAAO,KAAK,YAAA,GAAA,8BAAA,kBAAA,CAA6B,GAAG,CAAC,GACxF,EAAE,OAAO,IACR,QAAQS,2BAAAA,2BAA2B,MAAM,GAAG,GAC7C,MACF;GACA,OAAO,KAAK,eAAe,QAAQ,qBAAqB;EAC1D,CAAC;CACH;CAEA,OAAO,SAAiE;EACtE,MAAM,WAAW,KAAK,eAAiC;EACvD,IAAI,UAAU,OAAO;EACrB,OAAOV,8BAAAA,iBAAiB,IAAsB,OAAO,WAAW;GAC9D,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BC,2BAAAA,UAAU,gBAAgB,KAAK,OAAO,KAAK,SAAS,GACpD,EAAE,iBAAiB,SAAS,mBAAmB,MAAM,IACpD,QAAQU,2BAAAA,uBAAuB,MAAM,GAAG,GACzC,MACF;GACA,OAAO,KAAK,eAAe,QAAQ,eAAe;EACpD,CAAC;CACH;CAEA,iBAAwD;EACtD,IAAI,KAAK,SAAS,GAChB,OAAOX,8BAAAA,iBAAiB,aACtB,IAAIY,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAO;CACT;;;;;;CAOA,eACE,QACA,MASG;EACH,KAAK,SAAS,MAAM,OAAO,MAAM,CAAC,aAAa,CAAC;EAChD,KAAK,UAAU,aAAa;GAAE;GAAM,GAAG;EAAO,CAAiC;EAC/E,OAAO;CACT;AACF;;;;;ACzRA,SAAS,kBAAkB,MAA+B;CACxD,MAAM,OAAO,IAAI,YAAY,KAAK,UAAU;CAC5C,IAAI,WAAW,IAAI,CAAC,CAAC,IAAI,IAAI;CAC7B,OAAO;AACT;;;;;;;;;;;;;;;AAgBA,IAAa,4BAAb,MAAuE;CACrE,YACE,MACA,OACA,WACA,UACA,UACA,WACA;EANiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;EACA,KAAA,YAAA;CAChB;;;;;;;;;;;CAYH,OAA2C;EACzC,IAAI,KAAK,SAAS,GAChB,OAAOC,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAsB,OAAO,WAAW;GAC9D,MAAM,YAAY,OAAO,MAAoC;IAC3D,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,CAAC;IAK1C,OAAO,gBAAgB,UAAU,CAAC,QAAQ,CAAC,IACvCG,2BAAAA,UAAU,UAAU,KAAK,OAAO,SAAS,aAAa,IACtDA,2BAAAA,UAAU,YAAY,KAAK,OAAO,KAAK,WAAW,SAAS,aAAa;GAC9E;GACA,OAAO,KAAK,KAAK,mBACf,YACC,QAAQC,2BAAAA,uBAAuB,MAAM,GAAG,GACzC,OAAO,MAAM;IACX,MAAM,KAAK,SAAS,QAAQ,CAAC;GAC/B,GACA,MACF;EACF,CAAC;CACH;CAEA,KAAK,mBAAuC,WAAqD;EAC/F,IAAI,KAAK,SAAS,GAChB,OAAOJ,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAoB,OAAO,WAAW;GAC5D,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BG,2BAAAA,UAAU,eAAe,KAAK,OAAO,KAAK,SAAS,GACnD;IAAE;IAAmB;GAAU,IAC9B,QAAQE,2BAAAA,qBAAqB,MAAM,GAAG,GACvC,MACF;GAGA,IAAI,OAAO,OAAO,KAAK,SAAS,mBAAmB,OAAO,KAAK;GAG/D,KAAK,UAAU,aAAa;IAAE,MAAM;IAAe;IAAmB;IAAW,GAAG;GAAO,CAAC;GAC5F,OAAO;EACT,CAAC;CACH;CAEA,QAAQ,OAAwD;EAC9D,OAAO,KAAK,gBACVF,2BAAAA,UAAU,gBAAgB,KAAK,OAAO,KAAK,SAAS,GACpD,OACA,MAAM,MACN,MAAM,gBACR;CACF;CAEA,WAAW,OAA8D;EACvE,OAAO,KAAK,gBACVA,2BAAAA,UAAU,sBAAsB,KAAK,OAAO,KAAK,SAAS,GAC1D,OACA,MAAM,MACN,IACF;CACF;;;;;;CAOA,gBACE,MACA,MACA,MACA,kBACkC;EAClC,IAAI,KAAK,SAAS,GAChB,OAAOH,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAoB,OAAO,WAAW;GAC5D,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7B,MACA,OACC,QAAQM,2BAAAA,qBAAqB,MAAM,GAAG,GACvC,MACF;GACA,IAAI,OAAO,OAAO,KAAK,SAAS,mBAAmB,OAAO,KAAK;GAC/D,KAAK,UAAU,aAAa;IAAE,MAAM;IAAe;IAAM;IAAkB,GAAG;GAAO,CAAC;GACtF,OAAO;EACT,CAAC;CACH;CAEA,OACE,mBACA,UACoC;EACpC,IAAI,KAAK,SAAS,GAChB,OAAON,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAsB,OAAO,WAAW;GAC9D,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BG,2BAAAA,UAAU,iBAAiB,KAAK,OAAO,KAAK,SAAS,GACrD;IAAE;IAAmB;GAAS,IAC7B,QAAQI,2BAAAA,uBAAuB,MAAM,GAAG,GACzC,MACF;GAGA,IAAI,OAAO,OAAO,KAAK,SAAS,mBAAmB,OAAO,KAAK;GAC/D,KAAK,UAAU,aAAa;IAC1B,MAAM;IACN;IACA;IACA,GAAG;GACL,CAAC;GACD,OAAO;EACT,CAAC;CACH;CAEA,OAAO,mBAA2E;EAChF,IAAI,KAAK,SAAS,GAChB,OAAOP,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAsB,OAAO,WAAW;GAC9D,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BG,2BAAAA,UAAU,iBAAiB,KAAK,OAAO,KAAK,SAAS,GACrD,EAAE,kBAAkB,IACnB,QAAQK,2BAAAA,uBAAuB,MAAM,GAAG,GACzC,MACF;GAGA,IAAI,OAAO,OAAO,KAAK,SAAS,gBAAgB,OAAO,OAAO,iBAAiB;GAC/E,KAAK,UAAU,aAAa;IAAE,MAAM;IAAiB;IAAmB,GAAG;GAAO,CAAC;GACnF,OAAO;EACT,CAAC;CACH;CAEA,OAAO,OAAiC,WAAwD;EAC9F,IAAI,KAAK,SAAS,GAChB,OAAOR,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAsB,OAAO,WAAW;GAG9D,MAAM,SAAS,iBAAiB,cAAc,QAAQ,kBAAkB,KAAK;GAC7E,MAAM,OAAO,kBAAkB,cAAc,KAAA,IAAY,EAAE,UAAU,IAAI,CAAC,GAAG,EAC3E,QAAQ;IAAE,OAAO;IAAQ,UAAU;IAAmB,MAAM;GAAa,EAC3E,CAAC;GACD,MAAM,SAAS,MAAM,KAAK,KAAK,kBAC7BG,2BAAAA,UAAU,iBAAiB,KAAK,OAAO,KAAK,SAAS,GACrD,OACC,QAAQM,2BAAAA,uBAAuB,MAAM,GAAG,GACzC,MACF;GAIA,IAAI,OAAO,OAAO,KAAK,SAAS,gBAAgB,OAAO,KAAK;GAC5D,KAAK,UAAU,aAAa;IAAE,MAAM;IAAkB;IAAW,GAAG;GAAO,CAAC;GAC5E,OAAO;EACT,CAAC;CACH;CAEA,YAAY,MAA2B,WAAwD;EAC7F,IAAI,KAAK,SAAS,GAChB,OAAOT,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAsB,OAAO,WAAW;GAC9D,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BG,2BAAAA,UAAU,sBAAsB,KAAK,OAAO,KAAK,SAAS,GAC1D;IACE,MAAM,KAAK;IACX,GAAI,KAAK,UAAU,KAAA,IAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;IACxD,GAAI,cAAc,KAAA,IAAY,EAAE,UAAU,IAAI,CAAC;GACjD,IACC,QAAQM,2BAAAA,uBAAuB,MAAM,GAAG,GACzC,MACF;GACA,IAAI,OAAO,OAAO,KAAK,SAAS,gBAAgB,OAAO,KAAK;GAC5D,KAAK,UAAU,aAAa;IAAE,MAAM;IAAkB;IAAW,GAAG;GAAO,CAAC;GAC5E,OAAO;EACT,CAAC;CACH;CAEA,QAAQ,mBAAqE;EAC3E,IAAI,KAAK,SAAS,GAChB,OAAOT,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAIF,OAAOF,8BAAAA,iBAAiB,IAAgB,OAAO,WAC7C,KAAK,KAAK,cACRG,2BAAAA,UAAU,kBAAkB,KAAK,OAAO,KAAK,SAAS,GACtD,EAAE,kBAAkB,GACpB,MACF,CACF;CACF;CAEA,QACE,mBACA,QAA0B,WACW;EACrC,IAAI,KAAK,SAAS,GAChB,OAAOH,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAuB,OAAO,WAAW;GAC/D,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BG,2BAAAA,UAAU,kBAAkB,KAAK,OAAO,KAAK,SAAS,GACtD;IAAE;IAAmB;GAAM,IAC1B,QAAQO,2BAAAA,wBAAwB,MAAM,GAAG,GAC1C,MACF;GAEA,IAAI,OAAO,SAAS,MAAM,OAAO;GAEjC,KAAK,SAAS,MAAM,OAAO,MAAM,CAAC,WAAW,aAAa,CAAC;GAC3D,KAAK,UAAU,aAAa;IAC1B,MAAM;IACN,GAAG;GACL,CAAC;GACD,OAAO;EACT,CAAC;CACH;AACF;;;;;;;;;;;AC3SA,IAAa,gCAAb,MAA+E;CAC7E,YACE,MACA,OACA,WACA,UACA,UACA,WACA;EANiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;EACA,KAAA,YAAA;CAChB;CAEH,MAAM,OAAoE;EACxE,IAAI,KAAK,SAAS,GAChB,OAAOC,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAA0B,OAAO,WAAW;GAClE,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BG,2BAAAA,UAAU,qBAAqB,KAAK,OAAO,KAAK,SAAS,GACzD,EAAE,MAAM,IACP,QAAQC,2BAAAA,2BAA2B,MAAM,GAAG,GAC7C,MACF;GAEA,IAAI,OAAO,SAAS,MAAM,OAAO;GAGjC,KAAK,SAAS,MAAM,OAAO,MAAM,CAAC,WAAW,aAAa,CAAC;GAC3D,KAAK,UAAU,aAAa;IAC1B,MAAM;IACN,GAAG;GACL,CAAC;GACD,OAAO;EACT,CAAC;CACH;AACF;;;;;;;;;;;;;;;;;;;ACnBA,IAAa,6BAAb,MAAyE;CACvE,YACE,MACA,OACA,WACA,UACA,UACA;EALiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;CAChB;CAEH,MAAM,SAAuD;EAC3D,IAAI,KAAK,SAAS,GAChB,OAAOC,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB,KAAK,OAAO,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAiB,OAAO,WAAW;GAEzD,MAAM,QADO,QAAQ,QAAQ,YACP,UAAUG,2BAAAA,UAAU,mBAAmBA,2BAAAA,UAAU;GACvE,MAAM,OAAO,UACX,KAAK,KAAK,QACR,KAAK,KAAK,OAAO,KAAK,WAAW,KAAK,IACrC,QAAQC,2BAAAA,kBAAkB,MAAM,GAAG,GACpC,MACF;GACF,MAAM,SAAA,GAAA,8BAAA,qBAAA,CAA6B,QAAQ,KAAK;GAEhD,IAAI,QAAQ,WAAW,KAAA,GAAW;IAChC,IAAI;IACJ,IAAI;KACF,SAAA,GAAA,2BAAA,kBAAA,CAA0B,QAAQ,MAAM;IAC1C,QAAQ;KACN,MAAM,IAAIH,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,yBAAyB;IAC7E;IAGA,IAAI,cAAc,MAAM,KAAK,MAAM,cAAc,KAAK,GACpD,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,iEACF;IAEF,IAAI,QAAQ,cAAc,KAAA,KAAa,QAAQ,cAAc,MAAM,WACjE,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,oEACF;IAEF,IAAI;KACF,OAAO,MAAM,IAAI,QAAQ,MAAM;IACjC,SAAS,KAAK;KACZ,IAAID,8BAAAA,YAAY,GAAG,KAAKC,8BAAAA,gBAAgB,QAAQ,GAC9C,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,2EACF;KAEF,MAAM;IACR;GACF;GAEA,MAAM,QAAQ,WAAA,GAAA,2BAAA,kBAAA,CACM;IAChB;IACA;IACA,GAAI,QAAQ,cAAc,KAAA,IAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;IAC1E,MAAM;IACN,GAAI,QAAQ,WAAW,KAAA,IAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;GACnE,CAAC;GACH,IAAI;IAEF,OAAO,MAAM,IAAI,MAAA,GAAA,8BAAA,mBAAA,CAAwB,MADlB,KAAK,SAAS,IAAI,MAAM,CACE,CAAC,CAAC;GACrD,SAAS,KAAK;IACZ,IAAI,CAACD,8BAAAA,YAAY,GAAG,KAAKC,8BAAAA,gBAAgB,QAAQ,GAAG,MAAM;IAI1D,OAAO,MAAM,IAAI,MAAA,GAAA,8BAAA,mBAAA,CAAwB,MADrB,KAAK,SAAS,QAAQ,MAAM,CACF,CAAC,CAAC;GAClD;EACF,CAAC;CACH;AACF;;AAGA,SAAS,cAAc,OAA4B;CACjD,OAAO,KAAK,UAAU;EACpB,MAAM,QAAQ,MAAM;EACpB,MAAM;EACN,MAAM,YAAY,IAAI;EACtB,MAAM,kBAAkB,IAAI;EAC5B,MAAM,YAAY,IAAI;EACtB,MAAM,mBAAmB,IAAI;CAC/B,CAAC;AACH;;;ACvGA,SAAgB,uBAAuB,OAAiC;CACtE,MAAM,QAAQ,MAAM,MAAM,GAAG;CAC7B,IAAI,MAAM,WAAW,GACnB,MAAM,IAAIG,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,oCAAoC;CAExF,MAAM,gBAAgB,MAAM;CAC5B,IAAI;CACJ,IAAI;EACF,QAAQ,gBAAgB,aAAa;CACvC,SAAS,KAAK;EACZ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0BAA2B,IAAc,WAAW,KACtD;CACF;CACA,IAAI;CACJ,IAAI;EACF,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK;CACvC,SAAS,KAAK;EACZ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,mCAAoC,IAAc,WAAW,KAC/D;CACF;CACA,IAAI;CACJ,IAAI;EACF,SAAS,KAAK,MAAM,IAAI;CAC1B,SAAS,KAAK;EACZ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,kCAAmC,IAAc,WAAW,KAC9D;CACF;CACA,IAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GACvE,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,mCAAmC;CAEvF,OAAO;AACT;;;;;;AAOA,SAAS,gBAAgB,QAA4B;CACnD,MAAM,MAAM,OAAO,QAAQ,MAAM,GAAG,CAAC,CAAC,QAAQ,MAAM,GAAG;CACvD,MAAM,MAAM,IAAI,SAAS;CACzB,MAAM,SAAS,QAAQ,IAAI,MAAM,MAAM,IAAI,OAAO,IAAI,GAAG;CACzD,MAAM,MAAM,KAAK,MAAM;CACvB,MAAM,MAAM,IAAI,WAAW,IAAI,MAAM;CACrC,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,IAAI,KAAK,IAAI,WAAW,CAAC;CAC9D,OAAO;AACT;;;ACrDA,IAAa,+BAAb,MAA6E;CAa3E,YACE,MACA,OACA,WACA,aACA,MACA,eAA8B,MAC9B;EANiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EAEA,KAAA,OAAA;EAjBX,gBAAA,MAAA,SAAA,KAAA,CAAA;EACA,gBAAA,MAAA,UAAoC,IAAA;EAQ3B,gBAAA,MAAA,cAAA,KAAA,CAAA;EACA,gBAAA,MAAA,iBAAA,KAAA,CAAA;EAUf,KAAK,SAAA,GAAA,8BAAA,sBAAA,CAA8B,WAAW;EAC9C,MAAM,SAAS,eAAe,iBAAiB,YAAY,IAAI;EAC/D,KAAK,aAAa,MAAM,QAAQ,QAAQ,KAAK,IAAK,OAAQ,QAAkC,CAAC;EAC7F,KAAK,gBAAgB,SAAS,mBAAmB,MAAM,IAAI;CAC7D;CAEA,IAAI,UAAiC;EACnC,OAAO,KAAK;CACd;CAEA,IAAI,gBAA2C;EAC7C,OAAO,KAAK;CACd;;;;;;;CAQA,IAAI,iBAAwC;EAC1C,IAAI,KAAK,QAAQ,OAAO,KAAK,OAAO;EACpC,MAAM,QAAA,GAAA,8BAAA,cAAA,CAAqB,KAAK,MAAM,YAAY,IAAI;EACtD,OAAO,MAAM,MAAA,GAAA,8BAAA,eAAA,CAAoB,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK;CAChE;;;;;;;;CASA,OAAO,KAA6B;EAClC,IAAI,KAAK,QAAQ,eAAe,SAAS,GAAG,GAAG,OAAO;EACtD,MAAM,QAAA,GAAA,8BAAA,cAAA,CAAqB,KAAK,MAAM,YAAY,IAAI;EACtD,QAAA,GAAA,8BAAA,gBAAA,CAAuB,KAAK,KAAK,YAAY,IAAI;CACnD;;;;;;;;;;;CAYA,yBAAkC;EAChC,MAAM,KAAK,KAAK,YAAY,CAAC;EAC7B,QAAA,GAAA,8BAAA,YAAA,CAAmB,UAAU,WAAW,EAAE,GAAG,KAAK,SAAS,GAAG,IAAI,KAAK,QAAQ,CAAC;CAClF;CAEA,yBAAyB,QAA6B,QAA+B;EACnF,QAAA,GAAA,8BAAA,YAAA,CAAmB,QAAQ,QAAQ,KAAK,SAAS,GAAG,KAAK,YAAY,CAAC,GAAG,KAAK,QAAQ,CAAC;CACzF;CAEA,gCAAgC,SAA0B;EACxD,QAAA,GAAA,8BAAA,cAAA,CAAqB,SAAS,KAAK,UAAU,UAAU,KAAK,SAAS,GAAG,KAAK,QAAQ,CAAC;CACxF;;CAGA,WAA0C;EACxC,OAAO,KAAK,QAAQ,SAAS,KAAK;CACpC;CAEA,UAAkB;EAChB,QAAA,GAAA,8BAAA,cAAA,CAAqB,KAAK,MAAM,YAAY,IAAI;CAClD;;;;;;;;;CAUA,IAAI,WAAoC;EACtC,OAAO,KAAK,QAAQ,YAAY,KAAK;CACvC;;;;;;;CAQA,IAAI,iBAAiC;EACnC,QAAA,GAAA,8BAAA,wBAAA,CAA+B,KAAK,KAAK;CAC3C;CAEA,OAAO,OAAoE;EACzE,IAAI,KAAK,KAAK,SAAS,GACrB,OAAOC,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAA0B,OAAO,WAAW;GAClE,OAAO,MAAM,KAAK,WAAW,QAAQ;IACnC,UAAU,MAAM;IAChB,MAAM,MAAM,QAAQ;GACtB,CAAC;EACH,CAAC;CACH;;;;;;;;;;;;CAaA,kBAA0D;EACxD,IAAI,KAAK,KAAK,SAAS,GACrB,OAAOA,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAA0B,OAAO,WAAW;GAClE,OAAO,MAAM,KAAK,WAAW,QAAQ,EAAE,MAAM,MAAM,CAAC;EACtD,CAAC;CACH;;;;;;;;;;;CAYA,MAAc,WACZ,QACA,MAC+B;EAC/B,MAAM,WAAW,MAAM,KAAK,KAAK,SAI/BG,2BAAAA,UAAU,OAAO,KAAK,OAAO,KAAK,SAAS,GAC3C;GACE,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;GACnD,MAAM,KAAK;EACb,IACC,QAAQC,2BAAAA,qBAAqB,MAAM,GAAG,GACvC,MACF;EACA,KAAK,QAAQ,SAAS;EACtB,KAAK,SAAS;GACZ,KAAK,SAAS;GACd,eAAe,SAAS;GACxB,gBAAgB,SAAS;GACzB,OAAO,SAAS;GAChB,gBAAgB,SAAS;GACzB,UAAU,SAAS;GACnB,sBAAsB,SAAS;GAC/B,WAAW,SAAS;GAEpB,GAAI,SAAS,eAAe,EAAE,cAAc,SAAS,aAAa,IAAI,CAAC;EACzE;EACA,KAAK,KAAK,aAAa;GACrB,KAAK,SAAS;GACd,OAAO,KAAK;GACZ,WAAW,KAAK;EAClB,CAAC;EAID,OAAO;GAAE,UAAU,KAAK;GAAO,QAAQ,KAAK,UAAU,KAAA;EAAU;CAClE;AACF;;;;;;;;AASA,SAAS,iBAAiB,OAA+C;CACvE,IAAI;EACF,OAAO,uBAAuB,KAAK;CACrC,QAAQ;EACN,OAAO;CACT;AACF;;;;;;;AAQA,SAAS,WAAW,IAAoC;CACtD,OAAO;EACL,GAAI,GAAG,YAAY,KAAA,IAAY,EAAE,QAAQ,GAAG,QAAQ,IAAI,CAAC;EACzD,GAAI,GAAG,aAAa,KAAA,IAAY,EAAE,SAAS,GAAG,SAAS,IAAI,CAAC;CAC9D;AACF;AAEA,SAAS,mBAAmB,QAA0D;CACpF,MAAM,MAAwB,CAAC;CAC/B,IAAI,OAAO,OAAO,eAAe,UAAU,IAAI,UAAU,OAAO;CAChE,IAAI,OAAO,OAAO,gBAAgB,UAAU,IAAI,WAAW,OAAO;CAClE,IAAI,OAAO,OAAO,oBAAoB,UAAU,IAAI,eAAe,OAAO;CAC1E,IAAI,MAAM,QAAQ,OAAO,SAAS,GAAG;EACnC,MAAM,SAAU,OAAO,SAAS,CAAe,QAC5C,MAAmB,OAAO,MAAM,QACnC;EACA,IAAI,OAAO,SAAS,GAAG,IAAI,SAAS;CACtC;CACA,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,SAAS,IAAI,MAAM;AAC7C;;;;;;;;;;;;;;;;;;;AC3NA,IAAa,iCAAb,MAAiF;CAC/E,YACE,MACA,OACA,WACA,UACA,UACA,WACA;EANiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;EACA,KAAA,YAAA;CAChB;CAEH,OAA4C;EAC1C,MAAM,WAAW,KAAK,gBAAgB;EACtC,IAAI,UAAU,OAAO;EACrB,OAAOC,8BAAAA,iBAAiB,IAAuB,OAAO,WACpD,KAAK,KAAK,mBACR,OAAO,MAAM;GACX,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,CAAC;GAC1C,OAAOC,2BAAAA,UAAU,gBAAgB,KAAK,OAAO,KAAK,WAAW,SAAS,UAAU;EAClF,IACC,QAAQC,2BAAAA,wBAAwB,MAAM,GAAG,GAC1C,OAAO,MAAM;GACX,MAAM,KAAK,SAAS,QAAQ,CAAC;EAC/B,GACA,MACF,CACF;CACF;CAEA,SAAS,OAAmD;EAC1D,MAAM,WAAW,KAAK,gBAAgB;EACtC,IAAI,UAAU,OAAO;EACrB,OAAOF,8BAAAA,iBAAiB,IAAgB,OAAO,WAAW;GACxD,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,MAAM;GAC/C,MAAM,OAAO,MAAM,KAAK,UAAU,OAAO,MAAM;GAC/C,OAAO,KAAK,KAAK,SACfC,2BAAAA,UAAU,4BAA4B,KAAK,OAAO,SAAS,SAAS,IAAI,GACxE,MACF;EACF,CAAC;CACH;CAEA,OAAO,OAAqB,WAA0D;EACpF,MAAM,WAAW,KAAK,gBAAgB;EACtC,IAAI,UAAU,OAAO;EACrB,OAAOD,8BAAAA,iBAAiB,IAAgB,OAAO,WAAW;GACxD,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,MAAM;GAC/C,MAAM,OAAO,MAAM,KAAK,UAAU,OAAO,MAAM;GAC/C,OAAO,KAAK,KAAK,SACfC,2BAAAA,UAAU,0BAA0B,KAAK,OAAO,SAAS,SAAS,MAAM,SAAS,GACjF,MACF;EACF,CAAC;CACH;CAEA,cAAc,eAAqD;EACjE,MAAM,WAAW,KAAK,gBAAgB;EACtC,IAAI,UAAU,OAAO;EACrB,OAAOD,8BAAAA,iBAAiB,IAAgB,OAAO,WAAW;GACxD,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,MAAM;GAC/C,OAAO,KAAK,KAAK,SACfC,2BAAAA,UAAU,mBAAmB,KAAK,OAAO,SAAS,SAAS,aAAa,GACxE,MACF;EACF,CAAC;CACH;;;;;;CAOA,QAAQ,OAAuD;EAC7D,MAAM,WAAW,KAAK,gBAAgB;EACtC,IAAI,UAAU,OAAO;EACrB,OAAOD,8BAAAA,iBAAiB,IAAoB,OAAO,WAAW;GAC5D,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,MAAM;GAG/C,IADE,MAAM,UAAU,kBAAmB,MAAM,UAAU,KAAA,KAAa,SAAS,SAEzE,OAAO,KAAK,KAAK,mBACf,OAAO,MAAM;IACX,MAAM,UAAU,MAAM,KAAK,SAAS,IAAI,CAAC;IACzC,OAAOC,2BAAAA,UAAU,wBAAwB,KAAK,OAAO,KAAK,WAAW;KACnE,YAAY,QAAQ;KACpB,OAAO,MAAM;KACb,GAAI,MAAM,qBAAqB,KAAA,IAC3B,EAAE,kBAAkB,MAAM,iBAAiB,IAC3C,CAAC;KACL,GAAI,MAAM,WAAW,KAAA,IAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;IAC/D,CAAC;GACH,IACC,QAAQE,2BAAAA,qBAAqB,MAAM,GAAG,GACvC,OAAO,MAAM;IACX,MAAM,KAAK,SAAS,QAAQ,CAAC;GAC/B,GACA,MACF;GAEF,OAAO,KAAK,KAAK,QACfF,2BAAAA,UAAU,mBAAmB,KAAK,OAAO,SAAS,SAAS;IACzD,OAAO,MAAM;IACb,GAAI,OAAO,MAAM,UAAU,WAAW,EAAE,OAAO,MAAM,MAAM,cAAc,IAAI,CAAC;IAC9E,GAAI,MAAM,qBAAqB,KAAA,IAC3B,EAAE,kBAAkB,MAAM,iBAAiB,IAC3C,CAAC;IACL,GAAI,MAAM,WAAW,KAAA,IAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;GAC/D,CAAC,IACA,QAAQE,2BAAAA,qBAAqB,MAAM,GAAG,GACvC,MACF;EACF,CAAC;CACH;CAEA,QAAQ,OAAmE;EACzE,MAAM,WAAW,KAAK,gBAAgB;EACtC,IAAI,UAAU,OAAO;EACrB,OAAOH,8BAAAA,iBAAiB,IAAuB,OAAO,WAAW;GAC/D,MAAM,EAAE,YAAY,GAAG,SAAS;GAYhC,MAAM,OAAO,kBACX;IAXA,GAAG;IACH,GAAI,aACA,EACE,YAAY;KACV,UAAU;KACV,GAAI,WAAW,cAAc,KAAA,IAAY,EAAE,WAAW,WAAW,UAAU,IAAI,CAAC;IAClF,EACF,IACA,CAAC;GAGF,GACH,aACI,EACE,YAAY;IACV,OAAO,WAAW,IAAI,MAAM,CAAC,CAAC;IAC9B,UAAU;IACV,MAAM;GACR,EACF,IACA,CAAC,CACP;GACA,MAAM,WAAW,MAAM,KAAK,KAAK,kBAC/BC,2BAAAA,UAAU,uBAAuB,KAAK,OAAO,KAAK,SAAS,GAC3D,OACC,SAAA,GAAA,2BAAA,eAAA,CAAuBG,2BAAAA,4BAA4B,MAAM,GAAG,CAAC,GAC9D,MACF;GAGA,MAAM,KAAK,SAAS,QAAQ,MAAM;GAClC,KAAK,UAAU,aAAa;IAC1B,MAAM;IACN,WAAW,SAAS;IACpB,OAAO,MAAM;GACf,CAAC;GACD,OAAO;EACT,CAAC;CACH;CAEA,SAAS,OAA0E;EACjF,MAAM,WAAW,KAAK,gBAAgB;EACtC,IAAI,UAAU,OAAO;EACrB,OAAOJ,8BAAAA,iBAAiB,IAA6B,OAAO,WAAW;GACrE,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BC,2BAAAA,UAAU,uBAAuB,KAAK,OAAO,KAAK,WAAW,MAAM,SAAS,GAC5E;IAAE,MAAA,GAAA,2BAAA,SAAA,CAAc,MAAM,GAAG;IAAG,iBAAiB,MAAM;GAAgB,IAClE,QAAQI,2BAAAA,8BAA8B,MAAM,GAAG,GAChD,MACF;GAKA,MAAM,KAAK,SAAS,QAAQ,MAAM;GAClC,IAAI,OAAO,WAAW,aAAa;IACjC,KAAK,UAAU,aAAa;KAC1B,MAAM;KACN,WAAW,MAAM;KACjB,GAAG;IACL,CAAC;IACD,KAAK,UAAU,aAAa;KAAE,MAAM;KAAsB,SAAS,OAAO;IAAQ,CAAC;GACrF;GACA,OAAO;EACT,CAAC;CACH;CAEA,MAAM,WAA2D;EAC/D,MAAM,WAAW,KAAK,gBAAgB;EACtC,IAAI,UAAU,OAAO;EACrB,OAAOL,8BAAAA,iBAAiB,IAA0B,OAAO,WAAW;GAClE,MAAM,SAAS,MAAM,KAAK,KAAK,WAC7BC,2BAAAA,UAAU,oBAAoB,KAAK,OAAO,KAAK,WAAW,SAAS,IAClE,QAAQK,2BAAAA,2BAA2B,MAAM,GAAG,GAC7C,MACF;GACA,IAAI,OAAO,WAAW,WACpB,KAAK,UAAU,aAAa;IAAE,MAAM;IAAqB;GAAU,CAAC;GAEtE,OAAO;EACT,CAAC;CACH;;CAGA,MAAc,UAAU,OAAqB,QAAsC;EACjF,IAAI,MAAM,SAAS,OAAO,OAAO,MAAM;EAYvC,MAAM,SAAQ,MAXS,KAAK,KAAK,mBAC/B,OAAO,MAAM;GACX,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,CAAC;GAC1C,OAAOL,2BAAAA,UAAU,gBAAgB,KAAK,OAAO,KAAK,WAAW,SAAS,UAAU;EAClF,IACC,QAAQC,2BAAAA,wBAAwB,MAAM,GAAG,GAC1C,OAAO,MAAM;GACX,MAAM,KAAK,SAAS,QAAQ,CAAC;EAC/B,GACA,MACF,EAAA,CACuB,WAAW,MAC/B,MACC,EAAE,MAAM,SAAS,kBAAkB,EAAE,MAAM,sBAAsB,MAAM,iBAC3E;EACA,IAAI,CAAC,OACH,MAAM,IAAIK,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,uBAAuB,MAAM,mBAC/B;EAEF,OAAO,MAAM;CACf;CAEA,kBAA0D;EACxD,IAAI,CAAC,KAAK,SAAS,GAAG,OAAO;EAC7B,OAAOR,8BAAAA,iBAAiB,aACtB,IAAIO,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;CACF;AACF;;;ACvQA,IAAa,uBAAb,MAA6D;CAC3D,YACE,MACA,OACA,WACA,UACA,UACA,WACA;EANiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;EACA,KAAA,YAAA;CAChB;;;;;;;;;;CAWH,OAA2C;EACzC,IAAI,KAAK,SAAS,GAChB,OAAOC,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAsB,OAAO,WAAW;GAC9D,MAAM,YAAY,OAAO,MAAoC;IAC3D,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,CAAC;IAG1C,OAAO,gBAAgB,UAAU,CAAC,UAAU,CAAC,IACzCG,2BAAAA,UAAU,YAAY,KAAK,OAAO,SAAS,eAAe,IAC1DA,2BAAAA,UAAU,cAAc,KAAK,OAAO,KAAK,WAAW,SAAS,eAAe;GAClF;GACA,OAAO,KAAK,KAAK,mBACf,YACC,QAAQC,2BAAAA,uBAAuB,MAAM,GAAG,GACzC,OAAO,MAAM;IACX,MAAM,KAAK,SAAS,QAAQ,CAAC;GAC/B,GACA,MACF;EACF,CAAC;CACH;CAEA,OAAO,OAA8D;EACnE,IAAI,KAAK,SAAS,GAChB,OAAOJ,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAA0B,OAAO,WAAW;GAClE,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7BG,2BAAAA,UAAU,oBAAoB,KAAK,OAAO,KAAK,SAAS,GACxD,QACC,QAAQE,2BAAAA,2BAA2B,MAAM,GAAG,GAC7C,MACF;GAIA,IAAI,OAAO,OAAO,KAAK,SAAS,cAAc,OAAO,KAAK;GAC1D,KAAK,UAAU,aAAa;IAAE,MAAM;IAAoB,GAAG;GAAO,CAAC;GACnE,OAAO;EACT,CAAC;CACH;AACF;;;;;;;;;;;;AC1BA,IAAa,8BAAb,MAA2E;CACzE,YACE,MACA,OACA,WACA,kBACA,UACA,UACA,WACA;EAPiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,mBAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;EACA,KAAA,YAAA;CAChB;CAEH,OAAqD;EACnD,IAAI,KAAK,SAAS,GAChB,OAAOC,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAgC,OAAO,WAAW;GACxE,MAAM,YAAY,OAAO,MAAoC;IAC3D,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,CAAC;IAC1C,MAAM,OAAO,SAAS,MAAM,MAAM,MAAM,EAAE,MAAM,qBAAqB,KAAK,gBAAgB;IAC1F,IAAI,CAAC,MACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,KAAK,iBAAiB,eAAe,KAAK,OAC1E;IAMF,OAAO,gBAAgB,UAAU,CAAC,aAAa,CAAC,IAC5CC,2BAAAA,UAAU,mBACR,KAAK,OACL,KAAK,kBACL,KAAK,MAAM,iBACb,IACAA,2BAAAA,UAAU,qBACR,KAAK,OACL,KAAK,WACL,KAAK,kBACL,KAAK,MAAM,iBACb;GACN;GACA,OAAO,KAAK,KAAK,mBACf,YACC,QAAQC,2BAAAA,iCAAiC,MAAM,GAAG,GACnD,OAAO,MAAM;IACX,MAAM,KAAK,SAAS,QAAQ,CAAC;GAC/B,GACA,MACF;EACF,CAAC;CACH;CAEA,kBACE,UAC+C;EAC/C,OAAOJ,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YACFC,8BAAAA,gBAAgB,gBAChB,iHACF,CACF;CACF;CAEA,uBACE,UAA4C,CAAC,GACO;EACpD,IAAI,KAAK,SAAS,GAChB,OAAOF,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAsC,OAAO,WAAW;GAI9E,MAAM,SAAkC,QAAQ,UAAU;GAC1D,MAAM,YAAY,OAAO,MAAoC;IAC3D,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,CAAC;IAC1C,MAAM,OAAO,SAAS,MAAM,MAAM,MAAM,EAAE,MAAM,qBAAqB,KAAK,gBAAgB;IAC1F,IAAI,CAAC,MACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,KAAK,iBAAiB,eAAe,KAAK,OAC1E;IAEF,MAAM,aAAA,GAAA,2BAAA,wCAAA,CACJ;KAAE,GAAG;KAAS;IAAO,GACrB,EAAE,mBAAmB,KAAK,MAAM,kBAAkB,CACpD;IAGA,OAAO,gBAAgB,UAAU,CAAC,aAAa,CAAC,IAC5CC,2BAAAA,UAAU,6BAA6B,KAAK,OAAO,KAAK,kBAAkB,SAAS,IACnFA,2BAAAA,UAAU,+BACR,KAAK,OACL,KAAK,WACL,KAAK,kBACL,SACF;GACN;GAQA,OAAO,oBAAoB,MAPR,KAAK,KAAK,uBAC3B,WACA,OAAO,MAAM;IACX,MAAM,KAAK,SAAS,QAAQ,CAAC;GAC/B,GACA,MACF,CAC+B;EACjC,CAAC;CACH;;;;;;;;;;CAWA,aAAa,KAAyD;EACpE,IAAI,KAAK,SAAS,GAChB,OAAOH,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,IAAI,IAAI,qBAAqB,KAAK,kBAChC,OAAOF,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YACFC,8BAAAA,gBAAgB,YAChB,wBAAwB,IAAI,iBAAiB,WAAW,KAAK,kBAC/D,CACF;EAEF,IAAI,IAAI,SAAS,SACf,OAAOF,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YACFC,8BAAAA,gBAAgB,YAChB,oHACF,CACF;EAEF,MAAM,YAAA,GAAA,8BAAA,kBAAA,CAA6B,cAAc,GAAG,CAAC;EACrD,OAAOF,8BAAAA,iBAAiB,IAAuB,OAAO,WAAW;GAC/D,MAAM,YAAY,OAAO,MAAoC;IAC3D,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,CAAC;IAI1C,OAAO,gBAAgB,UAAU,CAAC,eAAe,aAAa,CAAC,IAC3DG,2BAAAA,UAAU,kBACR,KAAK,OACL,KAAK,kBACL,UACA,SAAS,kBACX,IACAA,2BAAAA,UAAU,oBACR,KAAK,OACL,KAAK,WACL,KAAK,kBACL,UACA,SAAS,kBACX;GACN;GAQA,OAAO,uBAAuB,MAPX,KAAK,KAAK,mBAC3B,WACA,OAAO,MAAM;IACX,MAAM,KAAK,SAAS,QAAQ,CAAC;GAC/B,GACA,MACF,CACkC;EACpC,CAAC;CACH;CAEA,OAAO,OAAkE;EACvE,IAAI,KAAK,SAAS,GAChB,OAAOH,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAA4B,OAAO,WAAW;GAMpE,MAAM,EAAE,MAAM,cAAc,OAAA,GAAA,8BAAA,yBAAA,CAA+B,KAAK;GAChE,MAAM,OAAOG,2BAAAA,UAAU,2BACrB,KAAK,OACL,KAAK,WACL,KAAK,gBACP;GACA,MAAM,SAAS,QAAiBE,2BAAAA,6BAA6B,MAAM,GAAG;GACtE,MAAM,SAAS,aAAa,SAAS,IACjC,MAAM,KAAK,KAAK,kBAAkB,MAAM,kBAAkB,MAAM,SAAS,GAAG,OAAO,MAAM,IACzF,MAAM,KAAK,KAAK,SAAS,MAAM,MAAM,OAAO,MAAM;GACtD,OAAO,KAAK,eAAe,QAAQ,oBAAoB;EACzD,CAAC;CACH;CAEA,OAAO,KAAoB,OAAkE;EAC3F,IAAI,KAAK,SAAS,GAChB,OAAOL,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,IAAI,IAAI,qBAAqB,KAAK,kBAChC,OAAOF,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YACFC,8BAAAA,gBAAgB,YAChB,wBAAwB,IAAI,iBAAiB,WAAW,KAAK,kBAC/D,CACF;EAEF,IAAI,IAAI,SAAS,SAAS;GAIxB,MAAM,OAAOC,2BAAAA,UAAU,qBACrB,KAAK,OACL,KAAK,WACL,IAAI,kBACJ,OACF;GACA,OAAOH,8BAAAA,iBAAiB,IAA4B,OAAO,WAAW;IACpE,MAAM,EAAE,MAAM,cAAc,OAAA,GAAA,8BAAA,yBAAA,CAA+B,KAAK;IAChE,MAAM,SAAS,MAAM,KAAK,cAAc,MAAM;KAAE;KAAK,OAAO;IAAK,GAAG,WAAW,MAAM;IACrF,OAAO,KAAK,eAAe,QAAQ,oBAAoB;GACzD,CAAC;EACH;EACA,MAAM,aAAA,GAAA,8BAAA,kBAAA,CAA8B,cAAc,GAAG,CAAC;EACtD,MAAM,OAAOG,2BAAAA,UAAU,qBACrB,KAAK,OACL,KAAK,WACL,IAAI,kBACJ,SACF;EACA,OAAOH,8BAAAA,iBAAiB,IAA4B,OAAO,WAAW;GACpE,MAAM,EAAE,MAAM,cAAc,OAAA,GAAA,8BAAA,yBAAA,CAA+B,KAAK;GAChE,MAAM,SAAS,MAAM,KAAK,cAAc,MAAM,EAAE,OAAO,KAAK,GAAG,WAAW,MAAM;GAChF,OAAO,KAAK,eAAe,QAAQ,oBAAoB;EACzD,CAAC;CACH;;CAGA,cACE,MACA,MACA,WACA,QACiC;EACjC,MAAM,SAAS,QAAiBM,2BAAAA,6BAA6B,MAAM,GAAG;EACtE,IAAI,aAAa,SAAS,GACxB,OAAO,KAAK,KAAK,mBAAmB,MAAM,kBAAkB,MAAM,SAAS,GAAG,OAAO,MAAM;EAE7F,OAAO,KAAK,KAAK,UAAU,MAAM,MAAM,OAAO,MAAM;CACtD;CAEA,OAAO,KAA8D;EACnE,IAAI,KAAK,SAAS,GAChB,OAAON,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,IAAI,IAAI,qBAAqB,KAAK,kBAChC,OAAOF,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YACFC,8BAAAA,gBAAgB,YAChB,wBAAwB,IAAI,iBAAiB,WAAW,KAAK,kBAC/D,CACF;EAEF,IAAI,IAAI,SAAS,SAAS;GAIxB,MAAM,OAAOC,2BAAAA,UAAU,qBACrB,KAAK,OACL,KAAK,WACL,IAAI,kBACJ,OACF;GACA,OAAOH,8BAAAA,iBAAiB,IAA4B,OAAO,WAAW;IACpE,MAAM,SAAS,MAAM,KAAK,KAAK,UAC7B,MACA;KAAE;KAAK,IAAI;IAAS,IACnB,QAAQO,2BAAAA,6BAA6B,MAAM,GAAG,GAC/C,MACF;IACA,OAAO,KAAK,eAAe,QAAQ,oBAAoB;GACzD,CAAC;EACH;EACA,MAAM,aAAA,GAAA,8BAAA,kBAAA,CAA8B,cAAc,GAAG,CAAC;EACtD,MAAM,OAAOJ,2BAAAA,UAAU,qBACrB,KAAK,OACL,KAAK,WACL,IAAI,kBACJ,SACF;EACA,OAAOH,8BAAAA,iBAAiB,IAA4B,OAAO,WAAW;GACpE,MAAM,SAAS,MAAM,KAAK,KAAK,WAC7B,OACC,QAAQO,2BAAAA,6BAA6B,MAAM,GAAG,GAC/C,MACF;GACA,OAAO,KAAK,eAAe,QAAQ,oBAAoB;EACzD,CAAC;CACH;CAEA,KAAK,MAAuB,SAAyD;EACnF,IAAI,KAAK,SAAS,GAChB,OAAOP,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAIF,KAAK,MAAM,KAAK,MACd,IAAI,EAAE,qBAAqB,KAAK,kBAC9B,OAAOF,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YACFC,8BAAAA,gBAAgB,YAChB,2BAA2B,EAAE,iBAAiB,6BAA6B,KAAK,kBAClF,CACF;EAGJ,MAAM,OAAOC,2BAAAA,UAAU,yBACrB,KAAK,OACL,KAAK,WACL,KAAK,gBACP;EACA,OAAOH,8BAAAA,iBAAiB,IAA0B,OAAO,WAAW;GAClE,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7B,MACA;IAAE;IAAM;GAAQ,IACf,QAAQQ,2BAAAA,2BAA2B,MAAM,GAAG,GAC7C,MACF;GACA,OAAO,KAAK,eAAe,QAAQ,kBAAkB;EACvD,CAAC;CACH;CAEA,QACE,MACA,QAA0B,WACiB;EAC3C,IAAI,KAAK,SAAS,GAChB,OAAOR,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,KAAK,MAAM,KAAK,MACd,IAAI,EAAE,qBAAqB,KAAK,kBAC9B,OAAOF,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YACFC,8BAAAA,gBAAgB,YAChB,8BAA8B,EAAE,iBAAiB,6BAA6B,KAAK,kBACrF,CACF;EAGJ,MAAM,OAAOC,2BAAAA,UAAU,4BACrB,KAAK,OACL,KAAK,WACL,KAAK,gBACP;EACA,OAAOH,8BAAAA,iBAAiB,IAA6B,OAAO,WAAW;GACrE,MAAM,SAAS,MAAM,KAAK,KAAK,SAC7B,MACA;IAAE;IAAM;GAAM,IACb,QAAQS,2BAAAA,8BAA8B,MAAM,GAAG,GAChD,MACF;GAEA,IAAI,OAAO,SAAS,MAAM,OAAO;GAEjC,KAAK,SAAS,MAAM,OAAO,MAAM,CAAC,WAAW,aAAa,CAAC;GAC3D,KAAK,UAAU,aAAa;IAAE,MAAM;IAAyB,GAAG;GAAO,CAAC;GACxE,OAAO;EACT,CAAC;CACH;CAEA,iBAAiB,MAAqD;EACpE,IAAI,KAAK,SAAS,GAChB,OAAOT,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,KAAK,MAAM,KAAK,MACd,IAAI,EAAE,qBAAqB,KAAK,kBAC9B,OAAOF,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YACFC,8BAAAA,gBAAgB,YAChB,uCAAuC,EAAE,iBAAiB,6BAA6B,KAAK,kBAC9F,CACF;EAIJ,OAAOF,8BAAAA,iBAAiB,IAAgB,OAAO,WAC7C,KAAK,KAAK,cACRG,2BAAAA,UAAU,+BAA+B,KAAK,OAAO,KAAK,WAAW,KAAK,gBAAgB,GAC1F,EAAE,KAAK,GACP,MACF,CACF;CACF;;;;;;;;CASA,eACE,QACA,MACG;EACH,KAAK,SAAS,MAAM,OAAO,MAAM,CAAC,aAAa,CAAC;EAChD,KAAK,UAAU,aAAa;GAC1B;GACA,kBAAkB,KAAK;GACvB,GAAG;EACL,CAAiC;EACjC,OAAO;CACT;AACF;;;;;;;;AASA,eAAe,oBAAoB,MAA2D;CAC5F,MAAM,cAAc,KAAK,IAAI,UAAU;CACvC,IAAI,OAAO,gBAAgB,UACzB,MAAM,IAAIF,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,gDACF;CAEF,IAAI;CACJ,IAAI;EACF,aAAa,KAAK,MAAM,WAAW;CACrC,SAAS,KAAK;EACZ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,0CAA2C,KAAe,WAAW,KACvE;CACF;CACA,MAAM,WAAWQ,2BAAAA,mCAAmC,MAAM,UAAU;CAEpE,MAAM,cAA2C,MAAM,QAAQ,IAC7D,SAAS,YAAY,IAAI,OAAO,UAAU;EACxC,MAAM,YAAY,KAAK,IAAI,MAAM,IAAI;EACrC,IAAI,cAAc,QAAQ,OAAO,cAAc,UAC7C,MAAM,IAAIT,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,2CAA2C,MAAM,KAAK,EACxD;EAEF,MAAM,OAAO;EACb,MAAM,QAAQ,IAAI,WAAW,MAAM,KAAK,YAAY,CAAC;EAQrD,MAAM,SAAA,GAAA,8BAAA,sBAAA,CAA8B;GANlC,OAAO,MAAM;GACb,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,aAAa,MAAM;GACnB,QAAQ;IAAE,MAAM;IAAS;GAAM;EAEQ,GAAG,EAC1C,MAAM,OAAO;GACX,OAAO;EACT,EACF,CAAC;EACD,OAAO;GACL,KAAK,MAAM;GACX,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ;EACF;CACF,CAAC,CACH;CAEA,OAAO;EAAE,WAAW,SAAS;EAAW;CAAY;AACtD;;;;;;AAOA,SAAS,cACP,KACyE;CACzE,IAAI,IAAI,SAAS,gBACf,OAAO;EAAE,MAAM;EAAgB,OAAO,IAAI;CAAkB;CAE9D,OAAO;EAAE,MAAM;EAAM,OAAO,IAAI;CAAG;AACrC;;;ACziBA,IAAa,2BAAb,MAAqE;CACnE,YACE,MACA,OACA,WACA,kBACA,UACA,UACA;EANiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,mBAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;CAChB;CAEH,OAA+C;EAC7C,IAAI,KAAK,SAAS,GAChB,OAAOS,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAA0B,OAAO,WAAW;GAClE,MAAM,YAAY,OAAO,MAAoC;IAC3D,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,CAAC;IAC1C,MAAM,OAAO,SAAS,MAAM,MAAM,MAAM,EAAE,MAAM,qBAAqB,KAAK,gBAAgB;IAC1F,IAAI,CAAC,MACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,KAAK,iBAAiB,eAAe,KAAK,OAC1E;IAIF,OAAO,gBAAgB,UAAU,CAAC,SAAS,CAAC,IACxCC,2BAAAA,UAAU,gBAAgB,KAAK,OAAO,KAAK,kBAAkB,KAAK,MAAM,cAAc,IACtFA,2BAAAA,UAAU,kBACR,KAAK,OACL,KAAK,WACL,KAAK,kBACL,KAAK,MAAM,cACb;GACN;GACA,OAAO,KAAK,KAAK,mBACf,YACC,QAAQC,2BAAAA,2BAA2B,MAAM,GAAG,GAC7C,OAAO,MAAM;IACX,MAAM,KAAK,SAAS,QAAQ,CAAC;GAC/B,GACA,MACF;EACF,CAAC;CACH;AACF;;;ACzCA,IAAa,yBAAb,MAAiE;CAC/D,YACE,MACA,OACA,WACA,kBACA,UACA,UACA;EANiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,mBAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;CAChB;CAEH,MAAM,UAA4B,CAAC,GAAsC;EACvE,IAAI,KAAK,SAAS,GAChB,OAAOC,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAqB,OAAO,WAAW;GAC7D,MAAM,SAAS,gBAAgB,QAAQ,MAAM;GAC7C,MAAM,qBAAqB,QAAQ,sBAAsB;GACzD,MAAM,YAAY,OAAO,MAAoC;IAC3D,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,CAAC;IAC1C,MAAM,OAAO,SAAS,MAAM,MAAM,MAAM,EAAE,MAAM,qBAAqB,KAAK,gBAAgB;IAC1F,IAAI,CAAC,MACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,KAAK,iBAAiB,eAAe,KAAK,OAC1E;IASF,MAAM,aAAA,GAAA,2BAAA,yBAAA,CACJ;KAAE,GAAG;KAAS;IAAO,GACrB;KACE,gBAAgB,KAAK,MAAM;KAC3B,GAAI,qBAAqB,EAAE,mBAAmB,KAAK,MAAM,kBAAkB,IAAI,CAAC;IAClF,CACF;IAQA,IAAI,oBACF,OAAO,gBAAgB,UAAU,CAAC,WAAW,aAAa,CAAC,IACvDC,2BAAAA,UAAU,uBAAuB,KAAK,OAAO,KAAK,kBAAkB,SAAS,IAC7EA,2BAAAA,UAAU,yBACR,KAAK,OACL,KAAK,WACL,KAAK,kBACL,SACF;IAEN,OAAO,gBAAgB,UAAU,CAAC,SAAS,CAAC,IACxCA,2BAAAA,UAAU,cAAc,KAAK,OAAO,KAAK,kBAAkB,SAAS,IACpEA,2BAAAA,UAAU,gBAAgB,KAAK,OAAO,KAAK,WAAW,KAAK,kBAAkB,SAAS;GAC5F;GAKA,MAAM,cAAc,MAAM,UAAU,MAAM;GAC1C,OAAO,2BACL;IACE;IACA,aAAa,SAAS;IACtB,QAAQ;KAAE,MAAM;KAAO,KAAK,KAAK,KAAK,YAAY,WAAW;IAAE;GACjE,GACA,KAAK,MACL,WACA,OAAO,MAAM;IACX,MAAM,KAAK,SAAS,QAAQ,CAAC;GAC/B,CACF;EACF,CAAC;CACH;CAEA,IAAI,UAA4D;EAC9D,OAAOH,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YACFC,8BAAAA,gBAAgB,gBAChB,uEACF,CACF;CACF;AACF;AAEA,SAAS,2BACP,QACA,MACA,WACA,gBACiB;CACjB,QAAA,GAAA,8BAAA,sBAAA,CAA6B,QAAQ,EACnC,OAAO,WACL,KAAK,mBAAmB,WAAW,gBAAgB,UAAU,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAC7F,CAAC;AACH;AAEA,SAAS,gBAAgB,QAA6D;CACpF,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,IAAI,WAAW,SAAS,WAAW,QAAQ,OAAO;CAClD,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,6DAA6D,OAAO,GACtE;AACF;;;;;;;;;;;AC9GA,IAAa,uBAAb,MAA6D;CAC3D,YACE,MACA,OACA,WACA,kBACA,UACA,UACA;EANiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,mBAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;CAChB;CAEH,OAA2C;EACzC,IAAI,KAAK,SAAS,GAChB,OAAOE,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,MAAM,WAAW,CAChF;EAEF,OAAOF,8BAAAA,iBAAiB,IAAsB,OAAO,WAAW;GAC9D,MAAM,YAAY,OAAO,MAAoC;IAC3D,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI,CAAC;IAC1C,MAAM,OAAO,SAAS,MAAM,MAAM,MAAM,EAAE,MAAM,qBAAqB,KAAK,gBAAgB;IAC1F,IAAI,CAAC,MACH,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,UAChB,8BAA8B,KAAK,iBAAiB,eAAe,KAAK,OAC1E;IAKF,OAAO,gBAAgB,UAAU,CAAC,SAAS,CAAC,IACxCC,2BAAAA,UAAU,YAAY,KAAK,OAAO,KAAK,kBAAkB,KAAK,MAAM,cAAc,IAClFA,2BAAAA,UAAU,cACR,KAAK,OACL,KAAK,WACL,KAAK,kBACL,KAAK,MAAM,cACb;GACN;GACA,OAAO,KAAK,KAAK,mBACf,YACC,QAAQC,2BAAAA,uBAAuB,MAAM,GAAG,GACzC,OAAO,MAAM;IACX,MAAM,KAAK,SAAS,QAAQ,CAAC;GAC/B,GACA,MACF;EACF,CAAC;CACH;AACF;;;ACrDA,IAAa,0BAAb,MAAmE;CACjE,YACE,MACA,OACA,WACA,KACA,UACA,UACA,WACA;EAPiB,KAAA,OAAA;EACA,KAAA,QAAA;EACA,KAAA,YAAA;EACA,KAAA,MAAA;EACA,KAAA,WAAA;EACA,KAAA,WAAA;EACA,KAAA,YAAA;CAChB;CACH,YAAyD;EACvD,OAAOC,8BAAAA,iBAAiB,IAAI,OAAO,WAAW;GAC5C,KAAK,MAAM;GAEX,OAAO,KAAK,KAAK,QACfC,2BAAAA,UAAU,mBAAmB,KAAK,OAAO,KAAK,WAAW,KAAK,GAAG,IAChE,QAAQC,2BAAAA,8BAA8B,MAAM,CAAC,CAAC,MAAM,GAAG,GACxD,MACF;EACF,CAAC;CACH;CACA,SAAS,SAAoD;EAC3D,OAAOF,8BAAAA,iBAAiB,IAAI,OAAO,WAAW;GAC5C,MAAM,QAAQ,QAAQ;GACtB,OAAO,eAAe;GACtB,KAAK,MAAM;GACX,MAAM,SAAS,MAAM,KAAK,KAAK,QAC7BC,2BAAAA,UAAU,eAAe,KAAK,OAAO,KAAK,WAAW,KAAK,GAAG,GAC7D,EAAE,QAAQ,IACT,QAAQE,2BAAAA,sBAAsB,MAAM,GAAG,GACxC,MACF;GACA,KAAK,SAAS,MAAM,OAAO,MAAM,CAAC,CAAC;GACnC,KAAK,UAAU,aAAa;IAAE,MAAM;IAAyB,GAAG;GAAO,CAAC;EAC1E,CAAC;CACH;CACA,QAAsB;EACpB,IAAI,KAAK,SAAS,GAChB,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,sBAAsB,KAAK,OAAO;CACxF;AACF;;;AC9CA,IAAa,kBAAb,MAAmD;CAOjD,YACE,kBACA,WACA,MACA,OACA,WACA,UACA,UACA,WACA;EARS,KAAA,mBAAA;EACA,KAAA,YAAA;EARF,gBAAA,MAAA,eAAA,KAAA,CAAA;EACA,gBAAA,MAAA,QAAA,KAAA,CAAA;EACA,gBAAA,MAAA,YAAA,KAAA,CAAA;EACA,gBAAA,MAAA,UAAA,KAAA,CAAA;EACA,gBAAA,MAAA,WAAA,KAAA,CAAA;EAYP,KAAK,UAAU,IAAI,wBACjB,MACA,OACA,WACA,kBACA,UACA,UACA,SACF;EACA,KAAK,cAAc,IAAI,4BACrB,MACA,OACA,WACA,kBACA,UACA,UACA,SACF;EACA,KAAK,OAAO,IAAI,qBACd,MACA,OACA,WACA,kBACA,UACA,QACF;EACA,KAAK,WAAW,IAAI,yBAClB,MACA,OACA,WACA,kBACA,UACA,QACF;EACA,KAAK,SAAS,IAAI,uBAChB,MACA,OACA,WACA,kBACA,UACA,QACF;CACF;AACF;;;;;;;;;;;;;;;;;AChBA,SAAgB,gBAAgB,KAAoB,aAA2C;CAC7F,IAAI,IAAI,oBAAoB,aAAa,OAAO;CAEhD,MAAM,SAAsB;EAC1B,MAAM;EACN,WAAW,IAAI,mBAAmB,WAAW,IAAI;EACjD,KAAK,IAAI;EACT,IAAI,IAAI;EACR,UAAU,IAAI;CAChB;CAEA,QAAQ,IAAI,MAAZ;EACE,KAAK,oBACH,OAAO;GAAE,MAAM;GAAyB;GAAQ,GAAI,IAAI;EAA4B;EACtF,KAAK,gBACH,OAAO;GACL,MAAM;GACN,kBAAkB,IAAI,oBAAoB,IAAI,cAAc,MAAM;GAClE;GACA,GAAI,IAAI;EACV;EACF,KAAK,gBACH,OAAO;GACL,MAAM;GACN,kBAAkB,IAAI,oBAAoB,IAAI,cAAc,MAAM;GAClE;GACA,GAAI,IAAI;EACV;EACF,KAAK,gBACH,OAAO;GACL,MAAM;GACN,kBAAkB,IAAI,oBAAoB,IAAI,cAAc,MAAM;GAClE;GACA,GAAI,IAAI;EACV;EACF,KAAK,cACH,OAAO;GACL,MAAM;GACN,kBAAkB,IAAI,oBAAoB,IAAI,cAAc,MAAM;GAClE;GACA,GAAI,IAAI;EACV;EACF,KAAK,cACH,OAAO;GACL,MAAM;GACN,mBAAmB,IAAI;GACvB;GACA,GAAI,IAAI;EACV;EACF,KAAK,gBAAgB;GACnB,MAAM,UAAU,IAAI;GACpB,MAAM,WAAY,QAAQ,OAAO,MAAM,MACpC,SAAS,KAAK,qBAAqB,IAAI,cAAc,EACxD,CAAC,EAAE,YAAY;GACf,OAAO;IACL,MAAM;IACN,mBAAmB,IAAI;IACvB;IACA;IACA,GAAG;GACL;EACF;EACA,KAAK,gBACH,OAAO;GACL,MAAM;GACN,mBAAmB,IAAI;GACvB;GACA,GAAI,IAAI;EACV;EAMF,KAAK;EACL,KAAK,qBACH,OAAO;GACL,MAAM;GACN;GACA,GAAI,IAAI;EACV;EACF,KAAK,iBACH,OAAO;GACL,MAAM;GACN;GACA,GAAI,IAAI;EACV;EACF,KAAK,mBACH,OAAO;GACL,MAAM;GACN;GACA,GAAI,IAAI;EACV;EACF,KAAK,qBACH,OAAO;GACL,MAAM;GACN;GACA,GAAI,IAAI;EACV;EACF,KAAK,qBACH,OAAO;GACL,MAAM;GACN;GACA,GAAI,IAAI;EACV;EAIF,KAAK;EACL,KAAK,cACH,OAAO;GAAE,MAAM;GAAqB;GAAQ,GAAI,IAAI;EAA+B;EACrF,KAAK,eACH,OAAO;GAAE,MAAM;GAAiB;GAAQ,GAAI,IAAI;EAA6B;EAC/E,KAAK,eACH,OAAO;GAAE,MAAM;GAAiB;GAAQ,GAAI,IAAI;EAA6B;EAC/E,KAAK,oBACH,OAAO;GAAE,MAAM;GAAqB;GAAQ,GAAI,IAAI;EAAkC;EACxF,KAAK;EACL,KAAK,+BACH,OAAO;GAAE,MAAM;GAAqB;GAAQ,GAAI,IAAI;EAAkC;EACxF,KAAK,oBACH,OAAO;GAAE,MAAM;GAAqB;GAAQ,GAAI,IAAI;EAAkC;EACxF,KAAK,qBACH,OAAO;GAAE,MAAM;GAAuB;GAAQ,GAAI,IAAI;EAAiC;EACzF,KAAK,qBACH,OAAO;GAAE,MAAM;GAAuB;GAAQ,GAAI,IAAI;EAAiC;EACzF,KAAK,qBACH,OAAO;GAAE,MAAM;GAAuB;GAAQ,GAAI,IAAI;EAA8B;EACtF,SACE,OAAO;CACX;AACF;;;;;;;;;;;;;;;;;;;;ACtJA,IAAa,YAAb,MAAuB;CAOrB,YAAY,MAAyC;EAAxB,KAAA,OAAA;EANrB,gBAAA,MAAA,UAAA,KAAA,CAAA;EACA,gBAAA,MAAA,UAAS,KAAA;EACT,gBAAA,MAAA,SAAgC,IAAA;EAChC,gBAAA,MAAA,cAAmD,IAAA;EACnD,gBAAA,MAAA,gBAAe,GAAA;EAGrB,KAAK,SAAS,KAAK;CACrB;CAEA,OAAa;EACX,IAAI,KAAK,QAAQ;EACjB,KAAU,IAAI;CAChB;CAEA,QAAc;EACZ,KAAK,SAAS;EACd,IAAI,KAAK,YAAY,aAAa,KAAK,UAAU;EACjD,KAAK,OAAO,MAAM;CACpB;CAEA,IAAI,cAA6B;EAC/B,OAAO,KAAK;CACd;CAEA,MAAc,MAAqB;EACjC,MAAM,YAAY,KAAK,IAAI;EAC3B,KAAK,QAAQ,IAAI,gBAAgB;EACjC,IAAI;GACF,MAAM,MAAM,MAAM,KAAK,KAAK,KAAK,OAC/B,KAAK,KAAK,MACV,KAAK,WAAW,OAAO,EAAE,iBAAiB,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC,GACnE,KAAK,MAAM,MACb;GACA,IAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;IAC5C,KAAK,SAAS;IACd,KAAK,KAAK,WAAW;IACrB;GACF;GACA,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,MAClB,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,SAAS,sBAAsB,IAAI,QAAQ;GAEnF,MAAM,KAAK,QAAQ,IAAI,IAAI;GAE3B,IAAI,KAAK,IAAI,IAAI,aAAa,KAAQ,KAAK,eAAe;EAC5D,QAAQ,CAER;EACA,IAAI,KAAK,QAAQ;EACjB,MAAM,SAAS,KAAK,gBAAgB,KAAM,KAAK,OAAO,IAAI;EAC1D,KAAK,aAAa,iBAAiB,KAAK,KAAK,IAAI,GAAG,MAAM;EAC1D,KAAK,eAAe,KAAK,IAAI,KAAK,eAAe,GAAG,GAAM;CAC5D;CAEA,MAAc,QAAQ,MAAiD;EACrE,MAAM,SAAS,KAAK,UAAU;EAC9B,MAAM,UAAU,IAAI,YAAY;EAChC,IAAI,SAAS;EACb,SAAS;GACP,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;GAC1C,IAAI,QAAQ,KAAK,QAAQ;GACzB,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;GAChD,SAAS;IACP,MAAM,MAAM,OAAO,QAAQ,MAAM;IACjC,IAAI,MAAM,GAAG;IACb,MAAM,QAAQ,OAAO,MAAM,GAAG,GAAG;IACjC,SAAS,OAAO,MAAM,MAAM,CAAC;IAC7B,KAAK,SAAS,KAAK;GACrB;EACF;CACF;CAEA,SAAiB,OAAqB;EACpC,IAAI,MAAM,WAAW,GAAG,GAAG;EAC3B,IAAI,KAAoB;EACxB,IAAI,QAAQ;EACZ,MAAM,OAAiB,CAAC;EACxB,KAAK,MAAM,QAAQ,MAAM,MAAM,IAAI,GACjC,IAAI,KAAK,WAAW,KAAK,GAAG,KAAK,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;OACvD,IAAI,KAAK,WAAW,QAAQ,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK;OAC1D,IAAI,KAAK,WAAW,OAAO,GAAG,KAAK,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;EAEnE,IAAI,OAAO,QAAQ,OAAO,SAAS,EAAE,GAAG,KAAK,SAAS;EACtD,IAAI,UAAU,YACZ,IAAI;GACF,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,KAAK,IAAI,CAAC,CAAkB;EAC9D,QAAQ,CAGR;OACK,IAAI,UAAU,gBACnB,KAAK,KAAK,cAAc;OACnB,IAAI,UAAU,gBAAgB;GAInC,KAAK,SAAS;GACd,KAAK,OAAO,MAAM;GAClB,KAAK,KAAK,WAAW;EACvB;CAGF;AACF;;;AClDA,IAAa,sBAAb,MAA2D;CA2CzD,YACE,MACA,IACA,YAAqCC,2BAAAA,oBACrC,aAQA,eAA8B,MAC9B,YAAoB,cAAc,MAClC;EAbiB,KAAA,OAAA;EAEA,KAAA,YAAA;EA7CV,gBAAA,MAAA,MAAA,KAAA,CAAA;EACA,gBAAA,MAAA,gBAAe;GACtB,4BAA4B;GAC5B,kBAAkB;EACpB,CAAA;EACS,gBAAA,MAAA,YAAA,KAAA,CAAA;EACA,gBAAA,MAAA,eAAA,KAAA,CAAA;EACA,gBAAA,MAAA,WAAA,KAAA,CAAA;EACA,gBAAA,MAAA,eAAA,KAAA,CAAA;EACA,gBAAA,MAAA,cAAA,KAAA,CAAA;EACA,gBAAA,MAAA,SAAA,KAAA,CAAA;EACA,gBAAA,MAAA,UAAA,KAAA,CAAA;EACA,gBAAA,MAAA,SAAA,KAAA,CAAA;EACA,gBAAA,MAAA,aAAA,KAAA,CAAA;EACA,gBAAA,MAAA,YAAA,KAAA,CAAA;EACA,gBAAA,MAAA,UAAA,KAAA,CAAA;EACA,gBAAA,MAAA,UAAA,KAAA,CAAA;EACQ,gBAAA,MAAA,aAAA,KAAA,CAAA;EACA,gBAAA,MAAA,OAAA,KAAA,CAAA;EACA,gBAAA,MAAA,aAAA,KAAA,CAAA;EACT,gBAAA,MAAA,aAA8B,IAAA;EAC9B,gBAAA,MAAA,kBAAiB,CAAA;EACjB,gBAAA,MAAA,UAAS,KAAA;EAaT,gBAAA,MAAA,iBAAyC,IAAA;EACzC,gBAAA,MAAA,oBAAqD,IAAA;EACrD,gBAAA,MAAA,wBAAuB,CAAA;EACvB,gBAAA,MAAA,sBAAA,KAAA,CAAA;EAES,gBAAA,MAAA,oBAAA,KAAA,CAAA;EAiBf,KAAK,KAAK;EACV,KAAK,qBAAqB,eAAe;EACzC,MAAM,WAAW,IAAI,6BACnB,MACA,IACA,WACA,eAAe,oBAAoB,EAAE,GACrC,EAAE,gBAAgB,KAAK,OAAO,GAC9B,YACF;EACA,KAAK,WAAW;EAOhB,KAAK,SAAS,EACZ,QAAQ,YAAY;GAElB,MAAM,cADS,SAAS,kBAAkB,MAAM,SAAS,gBAAgB,EAAA,CAAG,UAAU,KAAA,EAC3D;GAC3B,IAAI,CAAC,YAAY,OAAOC,8BAAAA;GACxB,OAAO;IACL,MAAM;IACN,UAAU,EAAE,QAAQ,WAAW,SAAS,OAAO;IAC/C,GAAI,WAAW,QAAQ,EAAE,OAAO,WAAW,MAAM,IAAI,CAAC;IACtD,GAAI,WAAW,cAAc,EAAE,aAAa,WAAW,YAAY,IAAI,CAAC;IACxE,GAAI,WAAW,oBAAoB,KAAA,IAC/B,EAAE,iBAAiB,WAAW,gBAAgB,IAC9C,CAAC;IACL,SAAS,WAAW;IACpB,YAAY,WAAW;IACvB,UAAU,WAAW;GACvB;EACF,EACF;EACA,MAAM,MAAM,IAAIC,0BAAAA,SAAS;EACzB,KAAK,MAAM;EACX,KAAK,YAAY;EAOjB,KAAK,SAAS;GACZ,YAAY,aAAa;IACvB,MAAM,cAAc,IAAI,UAAU,QAAQ;IAC1C,KAAK,mBAAmB;IACxB,IAAI,WAAW;IACf,aAAa;KACX,YAAY;KACZ,IAAI,CAAC,UAAU;MACb,WAAW;MACX,KAAK,oBAAoB;KAC3B;IACF;GACF;GACA,oBAAoB,IAAI,aAAa;EACvC;EACA,KAAK,YAAY,IAAIC,0BAAAA,sBAAsB,KAAK,SAAS;EACzD,KAAK,mBAAmB;GACtB,MAAM,WAAW,KAAK,YAAY,MAAM;GACxC,UAAU,WAAW,KAAK,gBAAgB,MAAM;GAChD,QAAQ,MAAM,SAAS,KAAK,eAAe,MAAM,IAAI;GACrD,qBAAqB,UAAU,KAAK,oBAAoB,KAAK;GAC7D,kBAAkB,OAAO,iBAAiB,KAAK,iBAAiB,OAAO,YAAY;GACnF,kBAAkB,UAAU,KAAK,iBAAiB,KAAK;GACvD,gBAAgB,UAAU,KAAK,eAAe,KAAK;GACnD,mBAAmB,UAAU,KAAK,kBAAkB,KAAK;EAC3D;EACA,KAAK,WAAW,IAAI,qBAClB,MACA,IACA,iBACM,KAAK,QACX,KAAK,kBACL,KAAK,SACP;EACA,KAAK,cAAc,IAAI,gCACrB,MACA,IACA,iBACM,KAAK,QACX,KAAK,gBACP;EACA,KAAK,UAAU,IAAI,4BACjB,MACA,IACA,iBACM,KAAK,QACX,KAAK,gBACP;EACA,KAAK,cAAc,IAAI,gCACrB,MACA,IACA,iBACM,KAAK,QACX,KAAK,kBACL,KAAK,SACP;EACA,KAAK,aAAa,IAAI,+BACpB,MACA,IACA,iBACM,KAAK,QACX,KAAK,kBACL,KAAK,SACP;EACA,KAAK,QAAQ,IAAI,0BACf,MACA,IACA,iBACM,KAAK,QACX,KAAK,kBACL,KAAK,SACP;EACA,KAAK,SAAS,IAAI,2BAChB,MACA,IACA,iBACM,KAAK,QACX,KAAK,gBACP;EACA,KAAK,QAAQ,IAAI,0BACf,MACA,IACA,iBACM,KAAK,QACX,KAAK,kBACL,KAAK,SACP;EACA,KAAK,YAAY,IAAI,8BACnB,MACA,IACA,iBACM,KAAK,QACX,KAAK,kBACL,KAAK,SACP;CACF;CAEA,KAAK,kBAAgD;EACnD,OAAO,IAAI,gBACT,kBACA,IACA,KAAK,MACL,KAAK,IACL,KAAK,iBACC,KAAK,QACX,KAAK,kBACL,KAAK,SACP;CACF;CAEA,SAAS,OAA+B,CAAC,GAAiC;EACxE,IAAI,KAAK,QACP,OAAOC,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,GAAG,WAAW,CAC7E;EAEF,MAAM,OAAO,KAAK,QAAQC,8BAAAA;EAC1B,OAAOH,8BAAAA,iBAAiB,IAAgB,OAAO,WAAW;GACxD,MAAM,YAAY,YAAY;IAC5B,MAAM,WAAW,MAAM,KAAK,YAAY,MAAM;IAC9C,OAAOI,2BAAAA,UAAU,uBAAuB,KAAK,IAAI,KAAK,WAAW;KAC/D,YAAY,SAAS;KACrB;IACF,CAAC;GACH;GACA,IAAI;IACF,OAAO,MAAM,KAAK,KAAK,SAAS,MAAM,UAAU,GAAG,MAAM;GAC3D,SAAS,KAAK;IACZ,IAAI,CAACH,8BAAAA,YAAY,GAAG,KAAKC,8BAAAA,gBAAgB,QAAQ,GAAG,MAAM;IAC1D,MAAM,KAAK,gBAAgB,MAAM;IACjC,OAAO,KAAK,KAAK,SAAS,MAAM,UAAU,GAAG,MAAM;GACrD;EACF,CAAC;CACH;;;;;;;CAQA,MAAM,YAAY,QAAgD;EAChE,IAAI,KAAK,eAAe,OAAO,KAAK;EACpC,IAAI,CAAC,KAAK,kBACR,KAAK,mBAAmB,EAAE,kBAAkB,KAAK,CAAC;EAEpD,MAAM,UAAU,KAAK;EACrB,IAAI,CAAC,SACH,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,+CAA+C,KAAK,IACtD;EAEF,OAAO,YAAY,SAAS,MAAM;CACpC;;;;;;CAOA,MAAM,gBAAgB,QAAgD;EAEpE,OAAO,YADS,KAAK,mBAAmB,EAAE,kBAAkB,MAAM,CACzC,GAAG,MAAM;CACpC;;;;;;;;;;CAWA,WAAmB,MAAwC;EACzD,MAAM,QAAQ,KAAK;EACnB,MAAM,SAAS,OAAO;EACtB,IAAI,CAAC,SAAS,CAAC,QAAQ;EACvB,IAAI,KAAK,OAAO,UAAU,OAAO,WAAW,OAAO,GAAG;EACtD,MAAM,OAAO,EAAE,GAAG,OAAO;EACzB,KAAK,MAAM,SAAS,MAAM,KAAK,SAAS;EACxC,KAAK,gBAAgB;GAAE,GAAG;GAAO,QAAQ;EAAK;CAChD;CAEA,eAAe,MAAoB,MAAwC;EACzE,KAAK,WAAW,IAAI;EACpB,MAAM,QAAQ,KAAK;EACnB,IAAI,OACF,KAAK,uBAAuB,KAAK,IAAI,KAAK,sBAAsB,MAAM,UAAU;EAElF,KAAK,mBAAmB;EAExB,IAAI,CAAC,KAAK,eAAe;EACzB,IAAI,OAAO;GACT,IAAI,MAAM,cAAc,KAAK,cAAc,YAAY;GACvD,IAAI,MAAM,uBAAuB,KAAK,cAAc,YAAY;IAC9D,KAAK,gBAAgB;IACrB;GACF;EACF;EAEA,MAAM,qBAAqB,IAAI,IAC7B,KAAK,cAAc,MAAM,KAAK,SAAS,CAAC,KAAK,MAAM,kBAAkB,IAAI,CAAC,CAC5E;EACA,KAAK,MAAM,aAAa,KAAK,eAAe;GAC1C,MAAM,WAAW,mBAAmB,IAAI,UAAU,gBAAgB;GAClE,IAAI,UACF,mBAAmB,IAAI,UAAU,kBAAkB;IACjD,GAAG;IACH,OAAO;GACT,CAAC;EAEL;EACA,IAAI,OACF,KAAK,MAAM,QAAQ,MAAM,OAAO;GAC9B,MAAM,WAAW,mBAAmB,IAAI,KAAK,gBAAgB;GAC7D,IAAI,UACF,mBAAmB,IAAI,KAAK,kBAAkB;IAC5C,GAAG;IACH,OAAO,KAAK;GACd,CAAC;EAEL;EAEF,KAAK,gBAAgB;GACnB,GAAG,KAAK;GACR,YAAY,OAAO,cAAc,KAAK,cAAc;GAIpD,GAAI,OAAO,uBAAuB,KAAA,IAC9B,EAAE,oBAAoB,MAAM,mBAAmB,IAC/C,CAAC;GAGL,GAAI,OAAO,iBAAiB,KAAA,IAAY,EAAE,cAAc,MAAM,aAAa,IAAI,CAAC;GAChF,GAAI,OAAO,YAAY,KAAA,IAAY,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;GAKjE,OAAO,MAAM,KAAK,mBAAmB,OAAO,CAAC,CAAC,CAAC,MAC5C,GAAG,MAAM,EAAE,MAAM,mBAAmB,EAAE,MAAM,gBAC/C;EACF;CACF;;;;;;;;;;CAWA,oBAA4B,OAAiC;EAG3D,KAAK,WAAW,CAAC,QAAQ,CAAC;EAC1B,KAAK,uBAAuB,KAAK,IAAI,KAAK,sBAAsB,MAAM,UAAU;EAChF,KAAK,mBAAmB;EAExB,IAAI,CAAC,KAAK,eAAe;EACzB,IAAI,MAAM,cAAc,KAAK,cAAc,YAAY;EACvD,IAAI,MAAM,uBAAuB,KAAK,cAAc,YAAY;GAC9D,KAAK,gBAAgB;GACrB;EACF;EACA,KAAK,gBAAgB;GACnB,GAAG,KAAK;GACR,YAAY,MAAM;GAClB,eAAe,MAAM;EACvB;CACF;;;;;;;CAQA,iBAAyB,OAA2B,cAAwC;EAI1F,KAAK,WAAW;GAAC;GAAU;GAAW;EAAa,CAAC;EACpD,KAAK,uBAAuB,KAAK,IAAI,KAAK,sBAAsB,MAAM,UAAU;EAChF,KAAK,mBAAmB;EAExB,IAAI,CAAC,KAAK,eAAe;EACzB,IAAI,MAAM,cAAc,KAAK,cAAc,YAAY;EACvD,IAAI,MAAM,uBAAuB,KAAK,cAAc,YAAY;GAC9D,KAAK,gBAAgB;GACrB;EACF;EACA,MAAM,UAAU,IAAI,IAAI,YAAY;EACpC,KAAK,gBAAgB;GACnB,GAAG,KAAK;GACR,YAAY,MAAM;GAClB,eAAe,MAAM;GACrB,OAAO,KAAK,cAAc,MAAM,QAAQ,SAAS,CAAC,QAAQ,IAAI,KAAK,MAAM,gBAAgB,CAAC;EAC5F;CACF;;;;;;;;;;;;CAaA,iBAAyB,OAAiC;EACxD,KAAK,WAAW;GAAC;GAAU;GAAW;EAAa,CAAC;EACpD,KAAK,uBAAuB,KAAK,IAAI,KAAK,sBAAsB,MAAM,UAAU;EAChF,KAAK,mBAAmB;EACxB,KAAK,gBAAgB;CACvB;;;;;;;;;CAUA,eAAuB,OAA4B;EACjD,KAAK,WAAW,CAAC,UAAU,CAAC;EAC5B,KAAK,uBAAuB,KAAK,IAAI,KAAK,sBAAsB,MAAM,UAAU;EAChF,KAAK,mBAAmB;EAExB,IAAI,CAAC,KAAK,eAAe;EACzB,IAAI,MAAM,cAAc,KAAK,cAAc,YAAY;EACvD,IAAI,MAAM,uBAAuB,KAAK,cAAc,YAAY;GAC9D,KAAK,gBAAgB;GACrB;EACF;EACA,KAAK,gBAAgB;GACnB,GAAG,KAAK;GACR,YAAY,MAAM;GAClB,iBAAiB,MAAM;EACzB;CACF;;;;;;;;;;CAWA,kBAA0B,OAA+B;EACvD,KAAK,WAAW,CAAC,aAAa,CAAC;EAC/B,KAAK,uBAAuB,KAAK,IAAI,KAAK,sBAAsB,MAAM,UAAU;EAChF,KAAK,mBAAmB;EAExB,IAAI,CAAC,KAAK,eAAe;EACzB,IAAI,MAAM,cAAc,KAAK,cAAc,YAAY;EACvD,IAAI,MAAM,uBAAuB,KAAK,cAAc,YAAY;GAC9D,KAAK,gBAAgB;GACrB;EACF;EACA,KAAK,gBAAgB;GACnB,GAAG,KAAK;GACR,YAAY,MAAM;GAClB,oBAAoB,MAAM;EAC5B;CACF;CAEA,mBAA2B,MAAgE;EACzF,MAAM,OAAO,IAAI,gBAAgB;EACjC,MAAM,UAAU,KAAK,cAAc,KAAK,QAAQ,IAAI;EACpD,KAAK,mBAAmB;EACxB,QACG,MAAM,aAAa;GAClB,IACE,SAAS,cAAc,KAAK,yBAC3B,CAAC,KAAK,iBAAiB,SAAS,cAAc,KAAK,cAAc,aAElE,KAAK,gBAAgB;EAEzB,CAAC,CAAC,CACD,YAAY,KAAA,CAAS,CAAC,CACtB,cAAc;GACb,IAAI,KAAK,qBAAqB,SAC5B,KAAK,mBAAmB;EAE5B,CAAC;EACH,OAAO;CACT;CAEA,MAAc,cACZ,QACA,MAC2B;EAC3B,IAAI,KAAK,QACP,MAAM,IAAID,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,YAAY,KAAK,GAAG,WAAW;EAEnF,MAAM,OAAO,KAAK,mBAAmB,KAAK,mBAAmB,IAAI;EACjE,IAAI,MACF,IAAI;GACF,OAAO,MAAM,KAAK,qBAAqB,MAAM,MAAM;EACrD,SAAS,KAAK;GACZ,IAAI,CAACD,8BAAAA,YAAY,GAAG,KAAKC,8BAAAA,gBAAgB,QAAQ,GAAG,MAAM;EAI5D;EAMF,MAAM,YAAY,MAAM,KAAK,KAAK,QAChCE,2BAAAA,UAAU,UAAU,KAAK,IAAI,KAAK,SAAS,IAC1C,QAAQC,2BAAAA,mBAAmB,MAAM,GAAG,GACrC,MACF;EACA,OAAO,KAAK,qBAAqB,WAAW,MAAM;CACpD;CAEA,qBAAkD;EAChD,MAAM,OAAO,KAAK;EAClB,KAAK,qBAAqB;EAC1B,OAAO;CACT;CAEA,qBAA6B,MAAoB,QAAgD;EAC/F,OAAO,KAAK,KAAK,QACfD,2BAAAA,UAAU,cAAc,KAAK,IAAI,KAAK,WAAW,KAAK,UAAU,IAC/D,QAAQE,2BAAAA,uBAAuB,MAAM,GAAG,GACzC,MACF;CACF;CAEA,QAAgC;EAC9B,IAAI,KAAK,QACP,OAAON,8BAAAA,iBAAiB,aAAmB,KAAA,CAAS;EAEtD,KAAK,SAAS;EACd,KAAK,WAAW,MAAM;EACtB,KAAK,YAAY;EACjB,KAAK,gBAAgB;EACrB,KAAK,mBAAmB;EACxB,OAAOA,8BAAAA,iBAAiB,aAAmB,KAAA,CAAS;CACtD;CAEA,qBAAmC;EACjC,KAAK,kBAAkB;EACvB,IAAI,KAAK,iBAAiB,KAAK,KAAK,UAAU,KAAK,WAAW;EAC9D,KAAK,YAAY,IAAI,UAAU;GAC7B,MAAM,KAAK;GACX,MAAMI,2BAAAA,UAAU,YAAY,KAAK,IAAI,KAAK,SAAS;GAKnD,eAAe,KAAK,IAAI,aAAa,KAAK,KAAK,eAAe,aAAa;GAC3E,QAAQ,QAAQ;IAId,IAAI,KAAK,iBAAiB,IAAI,KAAK,KAAK,cAAc,WACpD,KAAK,gBAAgB;KAAE,GAAG,KAAK;KAAe,WAAW,IAAI;IAAG;IAElE,MAAM,QAAQ,gBAAgB,KAAK,KAAK,SAAS;IACjD,IAAI,CAAC,OAAO;IAGZ,KAAK,kBAAkB,KAAK;IAC5B,KAAK,IAAI,QAAQ,KAAK;GACxB;GACA,qBAAqB;IAEnB,KAAK,gBAAgB;IACrB,KAAK,mBAAmB;IAGxB,KAAK,IAAI,QAAQ;KAAE,MAAM;KAAmB,QAAQ;KAAoB,IAAI,KAAK,IAAI;IAAE,CAAC;GAC1F;GACA,kBAAkB;IAIhB,KAAK,YAAY;GACnB;EACF,CAAC;EACD,KAAK,UAAU,KAAK;CACtB;CAEA,sBAAoC;EAClC,KAAK,iBAAiB,KAAK,IAAI,GAAG,KAAK,iBAAiB,CAAC;EACzD,IAAI,KAAK,mBAAmB,KAAK,KAAK,WAAW;GAC/C,KAAK,UAAU,MAAM;GACrB,KAAK,YAAY;EACnB;CACF;;;;CAKA,kBAA0B,OAA4B;EACpD,QAAQ,MAAM,MAAd;GACE,KAAK;IACH,KAAK,eAAe,MAAM,MAAM,CAAC,CAAC;IAClC;GACF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;IACH,KAAK,eAAe,MAAM,MAAM,CAAC,aAAa,CAAC;IAC/C;GACF,KAAK;GACL,KAAK;IACH,IAAI,MAAM,OAAO,KAAK,oBAAoB,MAAM,KAAK;IACrD;GACF,KAAK;IACH,IAAI,MAAM,OAAO,KAAK,iBAAiB,MAAM,OAAO,MAAM,iBAAiB;IAC3E;GACF,KAAK;IACH,IAAI,MAAM,OAAO,KAAK,iBAAiB,MAAM,KAAK;IAClD;GACF,KAAK;IACH,IAAI,MAAM,OAAO,KAAK,eAAe,MAAM,KAAK;IAChD;GACF,KAAK;GACL,KAAK;IACH,IAAI,MAAM,OAAO,KAAK,kBAAkB,MAAM,KAAK;IACnD;GACF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;IAIH,KAAK,eAAe,MAAM,MAAM,CAAC,aAAa,CAAC;IAC/C;GACF,KAAK;IAGH,IAAI,MAAM,MAAM,KAAK,eAAe,MAAM,MAAM,CAAC,aAAa,CAAC;IAC/D;GACF,KAAK;IAEH,IAAI,MAAM,MAAM,KAAK,eAAe,MAAM,MAAM,CAAC,WAAW,aAAa,CAAC;IAC1E;GACF,KAAK;IAIH,IAAI,MAAM,MAAM,KAAK,eAAe,MAAM,MAAM,CAAC,WAAW,aAAa,CAAC;IAC1E;EACJ;CACF;AACF;AAEA,SAAS,oBAAoB,IAA0B;CACrD,OAAO;EACL;EACA,SAAS;EACT,kBAAkB;EAClB,YAAY;EACZ,OAAO;EACP,YAAY;GAAE,OAAO;GAAW,kBAAkB;EAAK;EACvD,aAAa;GACX,OAAO;GACP,MAAM;GACN,YAAY;GACZ,UAAU;GACV,yBAAyB;GACzB,mBAAmB;EACrB;EACA,QAAQ;GACN,UAAU;GACV,SAAS,CAAC,qBAAqB;GAC/B,UAAUA,2BAAAA,UAAU,OAAO,IAAIR,2BAAAA,kBAAkB;EACnD;CACF;AACF;AAEA,SAAS,YAAe,SAAqB,QAAiC;CAC5E,IAAI,OAAO,SACT,OAAO,QAAQ,OAAO,IAAIW,8BAAAA,WAAW,OAAO,MAAM,CAAC;CAErD,OAAO,IAAI,SAAY,SAAS,WAAW;EACzC,MAAM,gBAAgB;GACpB,OAAO,IAAIA,8BAAAA,WAAW,OAAO,MAAM,CAAC;EACtC;EACA,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;EACxD,QAAQ,MACL,UAAU;GACT,OAAO,oBAAoB,SAAS,OAAO;GAC3C,QAAQ,KAAK;EACf,IACC,WAAW;GACV,OAAO,oBAAoB,SAAS,OAAO;GAC3C,OAAO,MAAM;EACf,CACF;CACF,CAAC;AACH;;;;;;;;;;AC9vBA,IAAa,qBAAb,cAAwC,MAAM;CAC5C,YACE,MACA,SACA,QACA;EACA,MAAM,OAAO;EAJJ,KAAA,OAAA;EAEA,KAAA,SAAA;EAGT,KAAK,OAAO;CACd;AACF;AAEA,eAAsB,mBACpB,SACA,YACA,OAA6B,CAAC,GACP;CAEvB,MAAM,MAAM,OADI,KAAK,SAAS,WAAW,MAAA,CACf,GAAG,QAAQ,QAAQ,OAAO,EAAE,EAAE,qBAAqB;EAC3E,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;EAC9C,MAAM,KAAK,UAAU;GACnB;GACA,GAAI,KAAK,aAAa,KAAA,IAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;EACnE,CAAC;CACH,CAAC;CACD,IAAI,CAAC,IAAI,IAAI;EACX,IAAI,OAAO;EACX,IAAI,UAAU,qCAAqC,IAAI;EACvD,IAAI;GACF,MAAM,UAAW,MAAM,IAAI,KAAK;GAChC,IAAI,QAAQ,OAAO,MAAM,OAAO,QAAQ,MAAM;GAC9C,IAAI,QAAQ,OAAO,SAAS,UAAU,QAAQ,MAAM;EACtD,QAAQ,CAER;EACA,MAAM,IAAI,mBAAmB,MAAM,SAAS,IAAI,MAAM;CACxD;CACA,OAAQ,MAAM,IAAI,KAAK;AACzB;;;;;;;;;;;;AAaA,SAAgB,6BAA6B,OAAwC;CAenF,OAAO,IAAIC,8BAAAA,YAbT,MAAM,SAAS,0BACXC,8BAAAA,gBAAgB,wBAChB,MAAM,SAAS,aACbA,8BAAAA,gBAAgB,WAChB,MAAM,SAAS,kBACb,MAAM,SAAS,sBACf,MAAM,SAAS,mBACfA,8BAAAA,gBAAgB,YAChB,MAAM,WAAW,MACfA,8BAAAA,gBAAgB,kBAChB,MAAM,WAAW,MACfA,8BAAAA,gBAAgB,aAChBA,8BAAAA,gBAAgB,SACD,0BAA0B,MAAM,WAAW;EACtE,SAAS;GAAE,WAAW,MAAM;GAAM,QAAQ,MAAM;EAAO;EACvD,OAAO;CACT,CAAC;AACH;;AAGA,MAAM,uBAAuB;;;;;;;;AAS7B,SAAgB,mBACd,SACA,YACA,OAA6B,CAAC,GACP;CACvB,IAAI,UAA+B;CACnC,IAAI,WAAmC;CACvC,OAAO,YAAY;EACjB,IAAI,WAAW,QAAQ,YAAY,KAAK,IAAI,IAAI,MAAO,sBACrD,OAAO,QAAQ;EAEjB,aAAA,WAAa,mBAAmB,SAAS,YAAY,IAAI,CAAC,CACvD,MAAM,SAAS;GACd,UAAU;GACV,OAAO,KAAK;EACd,CAAC,CAAC,CACD,cAAc;GACb,WAAW;EACb,CAAC;EACH,OAAO;CACT;AACF;;;AChEA,IAAa,aAAb,MAAa,WAAW;CAatB,YAAY,MAAyB;EAZpB,gBAAA,MAAA,QAAA,KAAA,CAAA;EACA,gBAAA,MAAA,WAAA,KAAA,CAAA;EACA,gBAAA,MAAA,WAAA,KAAA,CAAA;EACA,gBAAA,MAAA,qBAAA,KAAA,CAAA;EACA,gBAAA,MAAA,WAAA,KAAA,CAAA;EAKA,gBAAA,MAAA,aAAA,KAAA,CAAA;EACT,gBAAA,MAAA,cAAgC,IAAA;EAGtC,KAAK,OAAO,KAAK,QAAQ,QAAQ,OAAO,EAAE;EAC1C,MAAM,QAAQ,KAAK;EACnB,KAAK,UAAU,UAAU,KAAA,IAAY,OAAO,OAAO,UAAU,aAAa,cAAc;EACxF,KAAK,YAAY,KAAK,aAAa;EACnC,KAAK,UAAU,KAAK,SAAS,WAAW,MAAM,KAAK,UAAU;EAC7D,KAAK,oBAAoB,KAAK,qBAAqB;EACnD,KAAK,UAAU,KAAK;CACtB;;CAGA,IAAI,UAAkB;EACpB,OAAO,KAAK;CACd;;;;;;;CAQA,IAAI,YAAqC;EACvC,OAAO,KAAK;CACd;;;;;;;;CASA,UAAU,OAA8D;EACtE,OAAO,IAAI,WAAW;GACpB,SAAS,KAAK;GACd;GACA,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;GACtD,OAAO,KAAK;EACd,CAAC;CACH;;;;;CAMA,MAAM,OACJ,MACA,SACA,QACmB;EACnB,OAAO,KAAK,QAAQ,MAAM;GACxB,QAAQ;GACR,SAAS,IAAI,QAAQ;IAAE,QAAQ;IAAqB,GAAG;GAAQ,CAAC;GAChE;EACF,CAAC;CACH;;;;;;;;;;;;;;CAeA,aAAa,SAAkC;EAC7C,KAAK,aAAa;EAClB,IAAI,SAAS,KAAK,iBAAiB,OAAO,WAAW,aAAa,aAChE,KAAK,MAAM,UAAU,QAAQ,IAAI,eAAe;GAC9C,MAAM,QAAQ,CAAC,GAAG,OAAO,KAAK,GAAG,OAAO,OAAO;GAC/C,MAAM,KAAK,QAAQ,OAAO,QAAQ,KAAK;GACvC,IAAI,OAAO,QAAQ,MAAM,KAAK,UAAU,OAAO,QAAQ;GACvD,IAAI,OAAO,SAAS,MAAM,KAAK,4BAAW,IAAI,KAAK,OAAO,UAAU,GAAI,EAAA,CAAE,YAAY,GAAG;GACzF,MAAM,KAAK,iBAAiB,QAAQ;GACpC,WAAW,SAAS,SAAS,MAAM,KAAK,IAAI;EAC9C;CAEJ;;CAGA,IAAI,oBAAuC;EACzC,OAAO,KAAK;CACd;CAEA,YAAY,MAAsB;EAChC,OAAO,GAAG,KAAK,UAAU;CAC3B;CAEA,MAAM,QAAQ,MAAc,QAAoC;EAC9D,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM;GAAE,QAAQ;GAAO;EAAO,CAAC;EAC9D,IAAI,CAAC,IAAI,IAAI,MAAM,KAAK,cAAc,GAAG;EACzC,OAAO,MAAM,IAAI,KAAK;CACxB;CAEA,MAAM,SAAS,MAAc,QAA0C;EACrE,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM;GACnC,QAAQ;GACR,SAAS,IAAI,QAAQ,EAAE,QAAQ,kBAAkB,CAAC;GAClD;EACF,CAAC;EACD,IAAI,CAAC,IAAI,IAAI,MAAM,KAAK,cAAc,GAAG;EACzC,OAAO,IAAI,WAAW,MAAM,IAAI,YAAY,CAAC;CAC/C;;;;;;;;CASA,MAAM,eAAgC;EACpC,IAAI,CAAC,KAAK,SACR,MAAM,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,YAAY,qCAAqC;EAEzF,OAAO,MAAM,KAAK,QAAQ;CAC5B;CAEA,MAAM,QAAW,MAAc,QAA6B,QAAiC;EAC3F,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM;GAAE,QAAQ;GAAO;EAAO,CAAC;EAC9D,OAAO,MAAM,KAAK,kBAAkB,KAAK,MAAM;CACjD;;;;;;;;;;;;;;CAeA,MAAM,mBACJ,WACA,QACA,gBACA,QACY;EACZ,MAAM,cAAc,MAAM,UAAU,MAAM;EAC1C,IAAI;GACF,OAAO,MAAM,KAAK,QAAQ,aAAa,QAAQ,MAAM;EACvD,SAAS,KAAK;GACZ,IAAI,CAACD,8BAAAA,YAAY,GAAG,KAAKC,8BAAAA,gBAAgB,QAAQ,GAAG,MAAM;GAC1D,MAAM,eAAe,MAAM;GAC3B,MAAM,YAAY,MAAM,UAAU,MAAM;GACxC,OAAO,MAAM,KAAK,QAAQ,WAAW,QAAQ,MAAM;EACrD;CACF;;;;;;CAOA,MAAM,YAAY,MAAc,QAAwC;EACtE,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM;GACnC,QAAQ;GACR,SAAS,IAAI,QAAQ,EAAE,QAAQ,sBAAsB,CAAC;GACtD;EACF,CAAC;EACD,IAAI,CAAC,IAAI,IAAI,MAAM,KAAK,cAAc,GAAG;EACzC,OAAO,MAAM,IAAI,SAAS;CAC5B;;;;;;CAOA,MAAM,uBACJ,WACA,gBACA,QACmB;EACnB,MAAM,cAAc,MAAM,UAAU,MAAM;EAC1C,IAAI;GACF,OAAO,MAAM,KAAK,YAAY,aAAa,MAAM;EACnD,SAAS,KAAK;GACZ,IAAI,CAACD,8BAAAA,YAAY,GAAG,KAAKC,8BAAAA,gBAAgB,QAAQ,GAAG,MAAM;GAC1D,MAAM,eAAe,MAAM;GAC3B,MAAM,YAAY,MAAM,UAAU,MAAM;GACxC,OAAO,MAAM,KAAK,YAAY,WAAW,MAAM;EACjD;CACF;;;;;;;;CASA,MAAM,mBACJ,WACA,gBACA,QACe;EACf,MAAM,cAAc,MAAM,UAAU,MAAM;EAC1C,IAAI;GACF,OAAO,MAAM,KAAK,QAAQ,aAAa,MAAM;EAC/C,SAAS,KAAK;GACZ,IAAI,CAACD,8BAAAA,YAAY,GAAG,KAAKC,8BAAAA,gBAAgB,QAAQ,GAAG,MAAM;GAC1D,MAAM,eAAe,MAAM;GAC3B,MAAM,YAAY,MAAM,UAAU,MAAM;GACxC,OAAO,MAAM,KAAK,QAAQ,WAAW,MAAM;EAC7C;CACF;;CAGA,MAAM,QAAQ,MAAc,QAAgD;EAC1E,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM;GAAE,QAAQ;GAAO;EAAO,CAAC;EAC9D,IAAI,CAAC,IAAI,IAAI,MAAM,KAAK,cAAc,GAAG;EACzC,OAAO;GAAE,OAAO,IAAI,WAAW,MAAM,IAAI,YAAY,CAAC;GAAG,SAAS,IAAI;EAAQ;CAChF;;;;;;CAOA,MAAM,mBACJ,WACA,gBACA,QAC2B;EAC3B,MAAM,cAAc,MAAM,UAAU,MAAM;EAC1C,IAAI;GACF,OAAO,MAAM,KAAK,QAAQ,aAAa,MAAM;EAC/C,SAAS,KAAK;GACZ,IAAI,CAACD,8BAAAA,YAAY,GAAG,KAAKC,8BAAAA,gBAAgB,QAAQ,GAAG,MAAM;GAC1D,MAAM,eAAe,MAAM;GAC3B,MAAM,YAAY,MAAM,UAAU,MAAM;GACxC,OAAO,MAAM,KAAK,QAAQ,WAAW,MAAM;EAC7C;CACF;CAEA,MAAM,kBACJ,MACA,MACA,QACA,QACY;EACZ,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM;GAAE,QAAQ;GAAQ;GAAM;EAAO,CAAC;EACrE,OAAO,MAAM,KAAK,kBAAkB,KAAK,MAAM;CACjD;;CAGA,MAAM,mBACJ,MACA,MACA,QACA,QACY;EACZ,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM;GAAE,QAAQ;GAAS;GAAM;EAAO,CAAC;EACtE,OAAO,MAAM,KAAK,kBAAkB,KAAK,MAAM;CACjD;CAEA,MAAM,SACJ,MACA,MACA,QACA,QACY;EACZ,MAAM,MAAM,MAAM,KAAK,YAAY,MAAM,QAAQ,MAAM,MAAM;EAC7D,OAAO,MAAM,KAAK,kBAAkB,KAAK,MAAM;CACjD;CAEA,MAAM,QACJ,MACA,MACA,QACA,QACY;EACZ,OAAO,KAAK,kBAAkB,MAAM,KAAK,YAAY,MAAM,OAAO,MAAM,MAAM,GAAG,MAAM;CACzF;;CAGA,MAAM,cAAc,MAAc,MAAe,QAA0C;EACzF,MAAM,MAAM,MAAM,KAAK,YAAY,MAAM,QAAQ,MAAM,MAAM;EAC7D,IAAI,CAAC,IAAI,IAAI,MAAM,KAAK,cAAc,GAAG;EACzC,OAAO,IAAI,WAAW,MAAM,IAAI,YAAY,CAAC;CAC/C;;CAGA,MAAM,cACJ,MACA,OACA,aACA,QACA,QACY;EACZ,MAAM,UAAU,IAAI,QAAQ,EAAE,gBAAgB,YAAY,CAAC;EAG3D,MAAM,OAAO,IAAI,WAAW,KAAK,CAAC,CAAC;EACnC,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM;GAAE,QAAQ;GAAQ;GAAM;GAAS;EAAO,CAAC;EAC9E,OAAO,MAAM,KAAK,kBAAkB,KAAK,MAAM;CACjD;CAEA,MAAM,UACJ,MACA,MACA,QACA,QACY;EACZ,MAAM,MAAM,MAAM,KAAK,YAAY,MAAM,SAAS,MAAM,MAAM;EAC9D,OAAO,MAAM,KAAK,kBAAkB,KAAK,MAAM;CACjD;CAEA,MAAM,WAAc,MAAc,QAA6B,QAAiC;EAC9F,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM;GAAE,QAAQ;GAAU;EAAO,CAAC;EACjE,OAAO,MAAM,KAAK,kBAAkB,KAAK,MAAM;CACjD;CAEA,MAAM,YAAY,MAAc,QAAoC;EAClE,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM;GAAE,QAAQ;GAAU;EAAO,CAAC;EACjE,IAAI,IAAI,WAAW,KAAK;EACxB,IAAI,CAAC,IAAI,IAAI,MAAM,KAAK,cAAc,GAAG;CAC3C;CAEA,MAAM,UAAU,MAAc,MAAe,QAAoC;EAC/E,MAAM,MAAM,MAAM,KAAK,YAAY,MAAM,QAAQ,MAAM,MAAM;EAC7D,IAAI,IAAI,WAAW,KAAK;EACxB,IAAI,CAAC,IAAI,IAAI,MAAM,KAAK,cAAc,GAAG;CAC3C;CAEA,YACE,MACA,QACA,MACA,QACmB;EACnB,MAAM,UAAU,IAAI,QAAQ,EAAE,gBAAgB,mBAAmB,CAAC;EAClE,OAAO,KAAK,QAAQ,MAAM;GACxB;GACA,MAAM,KAAK,UAAU,QAAQ,CAAC,CAAC;GAC/B;GACA;EACF,CAAC;CACH;CAEA,MAAc,QAAQ,MAAc,MAAsC;EACxE,MAAM,EAAE,KAAK,aAAa,gBAAgB,KAAK,gBAAgB,IAAI;EACnE,MAAM,UAAU,IAAI,QAAQ,KAAK,WAAW,CAAC,CAAC;EAC9C,IAAI,KAAK,SAAS;GAChB,MAAM,QAAQ,MAAM,KAAK,QAAQ;GACjC,QAAQ,IAAI,iBAAiB,UAAU,OAAO;EAChD;EACA,IAAI,CAAC,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,UAAU,kBAAkB;EACpE,IAAI,KAAK,WAAW,QAAQ,IAAI,uBAAuB,KAAK,SAAS;EACrE,IAAI,aAAa,QAAQ,IAAI,YAAY,MAAM,YAAY,KAAK;EAKhE,IAAI,KAAK,qBAAqB,CAAC,aAAa;GAC1C,MAAM,MAAM,yBAAyB,KAAK,IAAI;GAC9C,IAAI,KAAK,QAAQ,IAAI,kBAAkB,mBAAmB,IAAI,EAAG,CAAC;EACpE;EAKA,KAAK,IAAI,UAAU,IAAK,WAAW;GACjC,MAAM,MAAM,MAAM,KAAK,QAAQ,KAAK;IAAE,GAAG;IAAM;GAAQ,CAAC;GACxD,IACE,IAAI,WAAW,OACf,WAAW,WAAW,eACtB,aAAa,KAAK,QAAQ,IAAI,GAE9B,OAAO;GAET,MAAM,OAAO,MAAM,cAAc,GAAG;GACpC,IAAI,SAAS,QAAQ,CAAC,cAAc,IAAI,IAAI,GAAG,OAAO;GACtD,MAAM,SAAS,OAAO,IAAI,QAAQ,IAAI,aAAa,CAAC;GAIpD,MAAM,UAHO,OAAO,SAAS,MAAM,IAC/B,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC,IAAI,KAAM,WAAW,kBAAkB,IAClE,WAAW,2BACQ,KAAM,KAAM,KAAK,OAAO;GAC/C,KAAK,UAAU;IAAE;IAAM;IAAM;IAAS;GAAO,CAAC;GAC9C,MAAM,iBAAiB,QAAQ,KAAK,UAAU,IAAI;EACpD;CACF;CAEA,MAAc,QAAQ,KAAa,MAAsC;EACvE,IAAI;GACF,OAAO,MAAM,KAAK,QAAQ,KAAK,IAAI;EACrC,SAAS,KAAK;GAIZ,IAAI,KAAK,QAAQ,SACf,MAAM,IAAIC,8BAAAA,WAAW,KAAK,OAAO,UAAU,GAAG;GAEhD,IAAK,KAAkC,SAAS,cAC9C,MAAM,IAAIA,8BAAAA,WAAY,IAAc,OAAO;GAE7C,MAAM,IAAIF,8BAAAA,YACRC,8BAAAA,gBAAgB,SAChB,kBAAmB,KAAe,WAAW,OAC7C,EACE,OAAO,IACT,CACF;EACF;CACF;CAEA,MAAc,kBAAqB,KAAe,QAAyC;EACzF,IAAI,CAAC,IAAI,IAAI,MAAM,KAAK,cAAc,GAAG;EACzC,MAAM,OAAgB,MAAM,IAAI,KAAK,CAAC,CAAC,aAAa,CAAC,EAAE;EACvD,IAAI;GACF,OAAO,OAAO,IAAI;EACpB,SAAS,KAAK;GACZ,MAAM,IAAID,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,8BAA+B,KAAe,WAAW,OACzD,EACE,OAAO,IACT,CACF;EACF;CACF;;;;;;;;CASA,gBAAwB,MAItB;EACA,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK,WAAW,KACvC,OAAO;GAAE,KAAK,GAAG,KAAK,UAAU;GAAQ,aAAa;GAAM,aAAa;EAAM;EAEhF,MAAM,WAAA,GAAA,2BAAA,eAAA,CAAyB;GAC7B;GACA,WAAW,KAAK;GAChB,OAAO,KAAK,WAAW;GACvB,WAAW,KAAK,WAAW;GAC3B,KAAK,KAAK,WAAW;EACvB,CAAC;EACD,OAAO;GACL,KAAK,QAAQ;GACb,aAAa,QAAQ,eAAe,QAAQ,aAAa,QAAQ,aAAa;GAC9E,aAAa,QAAQ;EACvB;CACF;CAEA,MAAc,cAAc,KAA+B;EACzD,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,IAAI,KAAK;EAC3B,QAAQ;GACN,UAAU;EACZ;EACA,MAAM,OAAO,gBAAgB,IAAI,MAAM;EACvC,IAAI,WAAW,OAAO,YAAY,YAAY,WAAW,SAAS;GAChE,MAAM,QAAS,QAA+B;GAC9C,MAAM,SAAS,cAAc,KAAK;GAClC,IAAI,QAAQ,MAAM,IAAID,8BAAAA,YAAY,OAAO,MAAM,OAAO,SAAS,EAAE,SAAS,OAAO,QAAQ,CAAC;GAK1F,MAAM,IAAIA,8BAAAA,YAAY,MAHpB,OAAO,UAAU,YAAY,SAAS,aAAa,QAC/C,OAAQ,MAA+B,OAAO,IAC9C,QAAQ,IAAI,UACe,EAAE,SAAS,EAAE,QAAQ,IAAI,OAAO,EAAE,CAAC;EACtE;EACA,MAAM,IAAIA,8BAAAA,YAAY,MAAM,QAAQ,IAAI,UAAU,EAAE,SAAS,EAAE,QAAQ,IAAI,OAAO,EAAE,CAAC;CACvF;AACF;AAve0B,gBAAA,YAAA,eAAc,CAAA;AACd,gBAAA,YAAA,sBAAqB,GAAA;AACrB,gBAAA,YAAA,0BAAyB,GAAA;AAuenD,SAAS,gBAAgB,QAAiC;CACxD,IAAI,WAAW,KAAK,OAAOC,8BAAAA,gBAAgB;CAC3C,IAAI,WAAW,KAAK,OAAOA,8BAAAA,gBAAgB;CAC3C,IAAI,WAAW,KAAK,OAAOA,8BAAAA,gBAAgB;CAC3C,IAAI,WAAW,KAAK,OAAOA,8BAAAA,gBAAgB;CAC3C,IAAI,WAAW,KAAK,OAAOA,8BAAAA,gBAAgB;CAC3C,IAAI,WAAW,KAAK,OAAOA,8BAAAA,gBAAgB;CAC3C,IAAI,WAAW,KAAK,OAAOA,8BAAAA,gBAAgB;CAC3C,OAAOA,8BAAAA,gBAAgB;AACzB;AAEA,SAAS,cAAc,OAA8C;CACnE,MAAM,SAASE,2BAAAA,yBAAyB,UAAU,KAAK;CACvD,OAAO,OAAO,UAAU,OAAO,OAAO;AACxC;AAEA,MAAM,gCAAgB,IAAI,IAAI,CAAC,cAAc,kBAAkB,CAAC;AAEhE,SAAS,aAAa,MAAgC;CACpD,OAAO,OAAO,mBAAmB,eAAe,gBAAgB;AAClE;;AAGA,eAAe,cAAc,KAAuC;CAClE,IAAI;EAEF,MAAM,QAAO,MADU,IAAI,MAAM,CAAC,CAAC,KAAK,EAAA,EAClB,OAAO;EAC7B,OAAO,OAAO,SAAS,WAAW,OAAO;CAC3C,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,iBAAiB,IAAY,QAA2C;CAC/E,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,IAAI,QAAQ,SAAS;GACnB,OAAO,IAAID,8BAAAA,WAAW,OAAO,UAAU,SAAS,CAAC;GACjD;EACF;EACA,MAAM,QAAQ,iBAAiB;GAC7B,QAAQ,oBAAoB,SAAS,OAAO;GAC5C,QAAQ;EACV,GAAG,EAAE;EACL,MAAM,gBAAsB;GAC1B,aAAa,KAAK;GAClB,OAAO,IAAIA,8BAAAA,WAAW,QAAQ,UAAU,SAAS,CAAC;EACpD;EACA,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;CAC3D,CAAC;AACH;;;;;;;;ACvlBA,IAAa,cAAb,MAAa,YAA8B;CACzC,OAAO,YAAY,MAAuC;EAIxD,MAAM,YAAY,UAAA,GAAA,0BAAA,aAAA,CAAsB;EACxC,OAAO,IAAI,YAAY,IAAI,WAAW;GAAE,GAAG;GAAM;EAAU,CAAC,GAAG,SAAS;CAC1E;CAIA,YACE,MAEA,WACA;EAHiB,KAAA,OAAA;EAEA,KAAA,YAAA;EALX,gBAAA,MAAA,aAAY,KAAA;CAMjB;CAEH,KAAK,OAAkB,SAAyD;EAC9E,IAAI,KAAK,WACP,OAAOE,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YAAYC,8BAAAA,gBAAgB,oBAAoB,kBAAkB,CACxE;EAMF,SAAc;EACd,SAAc;EAMd,MAAM,oBACJ,WAAW,cAAc,UAAW,QAAQ,YAAY,OAAS,MAAM,YAAY;EAErF,IAAI,MAAM,SAAS,SAAS;GAS1B,MAAM,MAAM,mBAAmB,KAAK,KAAK,SAAS,MAAM,YAAY;IAClE,GAAI,MAAM,kBAAkB,KAAA,IAAY,EAAE,UAAU,MAAM,cAAc,IAAI,CAAC;IAC7E,OAAO,KAAK,KAAK;GACnB,CAAC;GACD,MAAM,QAAQ,YAAY;IACxB,IAAI;KACF,OAAO,MAAM,IAAI;IACnB,SAAS,OAAO;KACd,MAAM,iBAAiB,qBAAqB,6BAA6B,KAAK,IAAI;IACpF;GACF;GACA,OAAO,KAAK,KAAK;IAAE,MAAM;IAAS;IAAO,UAAU,MAAM,YAAY;GAAK,GAAG,OAAO;EACtF;EAEA,IAAI,MAAM,SAAS,SAAS;GAQ1B,MAAM,cAAc,MAAM;GAC1B,OAAOF,8BAAAA,iBAAiB,IAAoB,OAAO,WAAW;IAC5D,MAAM,UAAU,KAAK,KAAK,UAAU,WAAW;IAC/C,MAAM,QAAQ,MAAM,QAAQ,aAAa;IACzC,MAAM,SAAS,uBAAuB,KAAK;IAC3C,MAAM,QAAQ,OAAO;IACrB,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAChD,MAAM,IAAIC,8BAAAA,YACRC,8BAAAA,gBAAgB,YAChB,iEACF;IAEF,MAAM,YACJ,OAAO,OAAO,eAAe,YAAY,OAAO,WAAW,SAAS,IAChE,OAAO,aACPC,2BAAAA;IACN,MAAM,OAAO,MAAM,QAAQ,QACzBC,2BAAAA,UAAU,UAAU,OAAO,SAAS,IACnC,QAAQC,2BAAAA,mBAAmB,MAAM,GAAG,GACrC,MACF;IACA,MAAM,SAAS,IAAI,oBACjB,SACA,KAAK,IACL,WACA,MACA,OACA,KAAK,SACP;IACA,MAAM,yBAAyB,QAAQ,MAAM,QAAQ,iBAAiB;IACtE,OAAO;GACT,CAAC;EACH;EAEA,IAAI,MAAM,SAAS,MAAM;GAKvB,MAAM,KAAK,MAAM;GACjB,MAAM,UAAU,MAAM,QAAQ,KAAK,KAAK,UAAU,MAAM,KAAK,IAAI,KAAK;GACtE,OAAOL,8BAAAA,iBAAiB,IAAoB,OAAO,WAAW;IAC5D,IAAI,YAAY,MAAM,aAAaG,2BAAAA;IAKnC,IAAI,gBAA+B;IACnC,IAAI;KACF,gBAAgB,MAAM,QAAQ,aAAa;IAC7C,QAAQ;KACN,gBAAgB;IAClB;IACA,IAAI,CAAC,MAAM,aAAa,eAAe;KACrC,MAAM,SAAS,uBAAuB,aAAa;KACnD,IAAI,OAAO,OAAO,eAAe,YAAY,OAAO,WAAW,SAAS,GACtE,YAAY,OAAO;IAEvB;IACA,MAAM,OAAO,MAAM,QAAQ,QACzBC,2BAAAA,UAAU,UAAU,IAAI,SAAS,IAChC,QAAQC,2BAAAA,mBAAmB,MAAM,GAAG,GACrC,MACF;IACA,MAAM,SAAS,IAAI,oBACjB,SACA,KAAK,IACL,WACA,MACA,eACA,KAAK,SACP;IACA,MAAM,yBAAyB,QAAQ,MAAM,QAAQ,iBAAiB;IACtE,OAAO;GACT,CAAC;EACH;EAGA,OAAOL,8BAAAA,iBAAiB,aACtB,IAAIC,8BAAAA,YACFC,8BAAAA,gBAAgB,YAChB,4EAA6E,MAA4B,KAAK,GAChH,CACF;CACF;CAEA,UAAkC;EAChC,IAAI,KAAK,WAAW,OAAOF,8BAAAA,iBAAiB,aAAmB,KAAA,CAAS;EACxE,KAAK,YAAY;EACjB,OAAOA,8BAAAA,iBAAiB,aAAmB,KAAA,CAAS;CACtD;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,eAAe,yBACb,QACA,MAIA,QACA,UACe;CACf,MAAM,UAAU,IAAI,IAAI,KAAK,OAAO,OAAO;CAK3C,MAAM,WAAW,OAAO;CAIxB,IADE,YAAY,SAAS,QAAQ,IAAI,UAAU,KAAK,KAAK,YAAY,oBAClD;EAEf,IAAI,MADmB,aAAa,SAAS,OAAO;GAAE;GAAU,MAAM;EAAM,CAAC,GAAG,MAAM,GACxE;EAKd,IAAI,QAAQ,IAAI,UAAU,GAAG;CAC/B;CAEA,IAAI,CAAC,KAAK,OAAO,UAAU;CAC3B,IAAI,QAAQ,IAAI,UAAU,GAAG;CAC7B,IAAI,CAAC,QAAQ,IAAI,KAAK,GAAG;CACzB,MAAM,aAAa,SAAS,gBAAgB,GAAG,MAAM;AACvD;;;AAIA,eAAe,aACb,SACA,QACkB;CAClB,MAAM,gBAAgB,QAAQ,MAAM,OAAO,0BAAU,IAAI,MAAM,SAAS,CAAC;CACzE,IAAI,OAAO,SAAS,QAAQ;MACvB,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;CAC7D,IAAI;EACF,MAAM;EACN,OAAO;CACT,QAAQ;EACN,OAAO;CACT,UAAU;EACR,OAAO,oBAAoB,SAAS,OAAO;CAC7C;AACF;;;ACzOA,SAAgB,kBAAkB,MAAuC;CACvE,OAAO,YAAY,YAAY,IAAI;AACrC;;;;;;;;;;;;;;;;;;;;;AAsBA,SAAgB,YAAY,MAAuC;CACjE,OAAO,YAAY,YAAY,IAAI;AACrC"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["AbortablePromise","EngineError","EngineErrorCode","wirePaths","DocumentActionsSnapshotSchema","EngineError","EngineErrorCode","AbortablePromise","EngineError","EngineErrorCode","wirePaths","AnnotationListSchema","AnnotationImportResultSchema","EngineError","EngineErrorCode","AbortablePromise","EngineError","EngineErrorCode","wirePaths","AttachmentListSchema","AttachmentCreateResultSchema","AttachmentDeleteResultSchema","AbortablePromise","EngineError","EngineErrorCode","wirePaths","ChangeResponseSchema","CHANGE_REQUEST_LIMITS","ChangeRequestSchema","AbortablePromise","wirePaths","FormSnapshotSchema","FormFieldDTOSchema","FormSetValueResultSchema","FormResetResultSchema","EngineError","EngineErrorCode","FormImportResultSchema","FormValuesImportResultSchema","FormFieldCreateResultSchema","FormFieldUpdateResultSchema","FormFieldDeleteResultSchema","FormWidgetLinkResultSchema","FormWidgetUpdateResultSchema","FormWidgetDeleteResultSchema","FormCalculationsReorderResultSchema","FormWidgetsReorderResultSchema","FormRepairResultSchema","AbortError","AbortablePromise","EngineError","EngineErrorCode","wirePaths","PageListSnapshotSchema","PageReorderResultSchema","PageNameResultSchema","PageRotateResultSchema","PageDeleteResultSchema","PageInsertResultSchema","PageFlattenResultSchema","AbortablePromise","EngineError","EngineErrorCode","wirePaths","RedactionApplyResultSchema","AbortablePromise","EngineError","EngineErrorCode","wirePaths","SearchSliceSchema","EngineError","EngineErrorCode","AbortablePromise","EngineError","EngineErrorCode","wirePaths","AccessResponseSchema","AbortablePromise","wirePaths","SignatureSnapshotSchema","ChangeAnalysisSchema","SignaturePreparedWireSchema","SignatureCompleteResultSchema","SignatureCancelResultSchema","EngineError","EngineErrorCode","wirePaths","DocumentMetadataSchema","MetadataUpdateResultSchema","CustomMetadataSchema","CustomMetadataUpdateResultSchema","EngineError","EngineErrorCode","AbortablePromise","AbortablePromise","EngineError","EngineErrorCode","AnnotationAppearanceBatchSchema","AbortablePromise","EngineError","EngineErrorCode","wirePaths","AnnotationListSchema","AnnotationCreateResultSchema","AnnotationUpdateResultSchema","AnnotationDeleteResultSchema","AnnotationReorderResultSchema","AnnotationFlattenResultSchema","AbortablePromise","EngineError","EngineErrorCode","wirePaths","AbortablePromise","EngineError","EngineErrorCode","PAGE_RENDER_FAMILIES","wirePaths","PageTextSnapshotSchema","AbortablePromise","PageGeometrySnapshotSchema","EngineError","EngineErrorCode","wirePaths","AbortablePromise","wirePaths","PageMeasurementViewportListSchema","PageScaleResultSchema","EngineError","EngineErrorCode","EngineError","EngineErrorCode","CHANGE_REQUEST_LIMITS","AbortError","EngineError","EngineErrorCode","EditSessionStatusSchema","DEFAULT_LAYER_NAME","wirePaths","ObjectNumberReservationResponseSchema","AbortablePromise","CONTINUOUS_RENDER_POLICY","EventHub","SessionEventPublisher","DEFAULT_BUNDLE_LIMITS","EngineError","EngineErrorCode","DEFAULT_PDF_SAVE_MODE","DocumentHeadSchema","DocumentManifestSchema","EngineError","EngineErrorCode","EngineError","EngineErrorCode","AbortError","EngineErrorPayloadSchema","AbortablePromise","EngineError","EngineErrorCode","DEFAULT_LAYER_NAME","wirePaths","DocumentHeadSchema"],"sources":["../src/document/planes.ts","../src/document/CloudDocumentActionsService.ts","../src/transport/bundleMultipart.ts","../src/document/CloudDocumentAnnotationsService.ts","../src/document/buildMutationForm.ts","../src/document/parseAttachmentContent.ts","../src/document/CloudDocumentAttachmentsService.ts","../src/document/CloudDocumentChanges.ts","../src/shared/withObjectNumbers.ts","../src/document/CloudDocumentFormsService.ts","../src/shared/awaitSignal.ts","../src/document/CloudDocumentPagesService.ts","../src/document/CloudDocumentRedactionService.ts","../src/document/CloudDocumentSearchService.ts","../src/transport/decodeUnverifiedClaims.ts","../src/document/CloudDocumentSecurityService.ts","../src/document/CloudDocumentSignaturesService.ts","../src/document/CloudMetadataService.ts","../src/document/CloudObjectNumberPool.ts","../src/document/appearanceForm.ts","../src/document/CloudPageAnnotationsService.ts","../src/document/CloudPageFormsService.ts","../src/document/CloudPageRenderService.ts","../src/document/CloudPageTextService.ts","../src/document/CloudPageMeasureService.ts","../src/document/CloudPageHandle.ts","../src/document/CloudWrites.ts","../src/realtime/auditRowToEvents.ts","../src/realtime/SseClient.ts","../src/document/CloudDocumentHandle.ts","../src/share.ts","../src/transport/HttpClient.ts","../src/CloudEngine.ts","../src/index.ts"],"sourcesContent":["import type { DocumentManifest, LayerScopePlane } from '@embedpdf/engine-core/wire';\n\n/**\n * Plane-scope resolution — the one rule every cloud service uses to pick a\n * path family: a read resolves at the doc-level (shared base) path iff every\n * plane it depends on is inherited (`'base'`) by this layer. One owned plane\n * → the layer-scoped path.\n *\n * Absent `scopes` (base manifests never carry it; pre-plane servers omit\n * it) means layer paths — never wrong, only unshared.\n */\nexport function planesInherited(\n manifest: DocumentManifest,\n planes: readonly LayerScopePlane[],\n): boolean {\n const scopes = manifest.scopes;\n if (!scopes) return false;\n return planes.every((plane) => scopes[plane] === 'base');\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type DocumentActionsService,\n type DocumentActionsSnapshot,\n} from '@embedpdf/engine-core/runtime';\nimport { DocumentActionsSnapshotSchema, wirePaths } from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { planesInherited } from './planes';\nimport type { HttpClient } from '../transport/HttpClient';\n\nexport class CloudDocumentActionsService implements DocumentActionsService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n ) {}\n\n get(): AbortablePromise<DocumentActionsSnapshot> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run((signal) =>\n this.http.getJsonWithRefresh(\n async (currentSignal) => {\n const manifest = await this.manifest.get(currentSignal);\n // Plane-scope rule: catalog actions depend on the `actions` plane\n // (constant-inherited until action writing exists) — one\n // doc-level URL, base session, no layer warm-up on open.\n return planesInherited(manifest, ['actions'])\n ? wirePaths.docActions(this.docId, manifest.actionsVersion)\n : wirePaths.layerActions(this.docId, this.layerName, manifest.actionsVersion);\n },\n (raw) => DocumentActionsSnapshotSchema.parse(raw),\n async (currentSignal) => {\n await this.manifest.refresh(currentSignal);\n },\n signal,\n ),\n );\n }\n}\n","import {\n EngineError,\n EngineErrorCode,\n type BundleKind,\n type BundleLimits,\n type ResourceId,\n} from '@embedpdf/engine-core/runtime';\n\n/** The server holds the bundle limits; the client only checks what arrived. */\nexport const NO_BUNDLE_LIMITS: BundleLimits = {\n bundleBytes: Infinity,\n manifestBytes: Infinity,\n items: Infinity,\n pages: Infinity,\n resources: Infinity,\n resourceBytes: Infinity,\n imagePixels: Infinity,\n};\n\n/**\n * An exported bundle as the server sends it: the `body` part (the bundle\n * without its bytes, as JSON) and one `resource:<id>` part per resource.\n * The caller checks the bundle.\n */\nexport async function readBundleParts(\n kind: BundleKind,\n form: FormData,\n): Promise<{ body: unknown; resources: Record<ResourceId, Uint8Array> }> {\n const body = form.get('body');\n if (typeof body !== 'string') {\n throw new EngineError(EngineErrorCode.WireFormat, `${kind} export has no body part`);\n }\n const resources: Record<ResourceId, Uint8Array> = {};\n const parts: Array<[string, FormDataEntryValue]> = [];\n form.forEach((value, name) => parts.push([name, value]));\n for (const [name, value] of parts) {\n if (!name.startsWith('resource:')) continue;\n if (typeof value === 'string') {\n throw new EngineError(EngineErrorCode.WireFormat, `${kind} export part ${name} is text`);\n }\n resources[name.slice('resource:'.length) as ResourceId] = new Uint8Array(\n await value.arrayBuffer(),\n );\n }\n return { body: JSON.parse(body), resources };\n}\n\n/**\n * A bundle import as one multipart body: the `body` part (the bundle\n * without its bytes, and the options), then each resource once, as a\n * `resource:<id>` part.\n */\nexport function bundleImportForm(\n body: unknown,\n resources: Readonly<Record<string, Uint8Array>>,\n): FormData {\n const form = new FormData();\n form.append('body', JSON.stringify(body));\n for (const [id, bytes] of Object.entries(resources)) {\n form.append(`resource:${id}`, new Blob([bytes as BlobPart]), id);\n }\n return form;\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n annotationImportFacts,\n concatAnnotationLists,\n assertAnnotationBundle,\n assertAnnotationBundleManifest,\n opIdOf,\n type AnnotationBundle,\n type BundleLimits,\n type AnnotationExportSelection,\n type AnnotationImportBody,\n type AnnotationImportOptions,\n type AnnotationImportResult,\n type AnnotationList,\n type AnnotationListOptions,\n type DocumentAnnotationsService,\n type DocumentManifest,\n type ManifestPage,\n type PageObjectNumber,\n type PageRef,\n type SessionEventPublisher,\n} from '@embedpdf/engine-core/runtime';\nimport {\n AnnotationImportResultSchema,\n AnnotationListSchema,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { CloudWrites } from './CloudWrites';\nimport { planesInherited } from './planes';\nimport { bundleImportForm, NO_BUNDLE_LIMITS, readBundleParts } from '../transport/bundleMultipart';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/** Bulk-read restarts after a mid-flight mutation staled the pinned\n * version (404 on the immutable leaf → refresh the manifest → retry). */\nconst MAX_COHERENCE_RESTARTS = 2;\n\nexport class CloudDocumentAnnotationsService implements DocumentAnnotationsService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n private readonly writes: CloudWrites,\n /** The server's import limits, as its `/v1/access` advertises them. */\n private readonly importLimits: () => Promise<BundleLimits>,\n ) {}\n\n /**\n * Every page: one coherent whole-document snapshot, a single read of the\n * immutable `annotations/items@annotationsVersion=N` leaf at the\n * manifest's pin — materialized server-side by one raw (no page-load)\n * sweep, CDN-cacheable because the pin bumps only when annotation list\n * bodies actually change. A stale pin mid-read (a concurrent mutation →\n * 404) refreshes the manifest and retries, so the result always belongs\n * to one document moment (the torn read this method exists to prevent).\n *\n * Some pages: each page's versioned leaf, the same read as\n * `page.annotations.list()`, in the order asked.\n */\n list(options: AnnotationListOptions = {}): AbortablePromise<AnnotationList> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n const { pages } = options;\n if (pages !== undefined) {\n return AbortablePromise.run<AnnotationList>(async (signal) =>\n concatAnnotationLists(await Promise.all(pages.map((page) => this.readPage(page, signal)))),\n );\n }\n return AbortablePromise.run<AnnotationList>(async (signal) => {\n for (let attempt = 0; ; attempt++) {\n const manifest =\n attempt === 0 ? await this.manifest.get(signal) : await this.manifest.refresh(signal);\n try {\n const list = await this.readBulkAt(manifest, signal);\n return { ...list, auditHead: list.auditHead ?? manifest.auditHead };\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound) || attempt >= MAX_COHERENCE_RESTARTS) {\n throw err;\n }\n // The pin staled under us; retry against the fresh manifest.\n }\n }\n });\n }\n\n /** One bulk leaf read at the manifest's pin. The server stamps the body's\n * `auditHead` at materialization time; a CDN-cached body may carry a\n * cursor older than the current manifest's, which is still safe — the\n * pin proves no items-affecting mutation landed in between, so replaying\n * that window over the body is all no-ops. */\n private async readBulkAt(\n manifest: DocumentManifest,\n signal: AbortSignal,\n ): Promise<AnnotationList> {\n const path = planesInherited(manifest, ['annotations'])\n ? wirePaths.docAnnotationsAll(this.docId, manifest.annotationsVersion)\n : wirePaths.layerAnnotationsAll(this.docId, this.layerName, manifest.annotationsVersion);\n return this.http.getJson(path, (raw) => AnnotationListSchema.parse(raw), signal);\n }\n\n /** One page's versioned leaf, with the standard stale-pin retry\n * (404 → refresh the manifest → once). */\n private readPage(page: PageRef, signal: AbortSignal): Promise<AnnotationList> {\n return this.http.getJsonWithRefresh(\n async (s) => this.versionedPagePath(await this.manifest.get(s), page.objectNumber),\n (raw) => AnnotationListSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n }\n\n /**\n * One versioned, CDN-cacheable read at the manifest's annotation and\n * layout pins, with the stale-pin retry (404 → refresh the manifest →\n * once). The response is the bundle without its bytes and one part per\n * resource; every part is checked against its id before it is returned.\n */\n export(selection: AnnotationExportSelection = {}): AbortablePromise<AnnotationBundle> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AnnotationBundle>(async (signal) => {\n const read = async (s: AbortSignal): Promise<FormData> => {\n const manifest = await this.manifest.get(s);\n const path = this.exportPathAt(manifest, selection);\n if (path) return this.http.getFormData(path, s);\n // More refs than a URL holds: the pins and the selection in a POST\n // body.\n return this.http.postJsonFormData(\n wirePaths.layerAnnotationsExportRequest(this.docId, this.layerName),\n {\n annotationsVersion: manifest.annotationsVersion,\n layoutVersion: manifest.layoutVersion,\n selection,\n },\n s,\n );\n };\n let form: FormData;\n try {\n form = await read(signal);\n } catch (error) {\n // A pin that moved since the manifest was read: read it again, once.\n if (!EngineError.is(error, EngineErrorCode.NotFound)) throw error;\n await this.manifest.refresh(signal);\n form = await read(signal);\n }\n const { body, resources } = await readBundleParts('annotation', form);\n const bundle = { ...(body as Omit<AnnotationBundle, 'resources'>), resources };\n await assertAnnotationBundle(bundle, NO_BUNDLE_LIMITS);\n return bundle;\n });\n }\n\n /**\n * One request: the bundle's manifest and each resource once, as parts of\n * one multipart POST under the import's `opId` as `Idempotency-Key`, so a\n * retry applies once. The server holds the limits; the same numbers are checked\n * here first, so a bundle past one fails before its bytes move.\n */\n import(\n bundle: AnnotationBundle,\n options: AnnotationImportOptions = {},\n ): AbortablePromise<AnnotationImportResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AnnotationImportResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const { resources, ...rest } = bundle;\n const sizes = new Map(Object.entries(resources).map(([id, bytes]) => [id, bytes.length]));\n assertAnnotationBundleManifest(bundle, sizes, await this.importLimits());\n const body: AnnotationImportBody = {\n bundle: rest,\n options: {\n ...(options.pages !== undefined ? { pages: options.pages } : {}),\n ...(options.attribution !== undefined ? { attribution: options.attribution } : {}),\n },\n };\n const form = bundleImportForm(body, resources);\n const result = await write.send((sent) =>\n this.http.postMultipartJson(\n wirePaths.layerAnnotationsImport(this.docId, this.layerName),\n form,\n (raw) => AnnotationImportResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n this.manifest.apply(result.meta, ['annotations']);\n this.publisher.publishWrite(\n opId,\n ...annotationImportFacts(result).map((fact) => ({\n type: 'annotations.created' as const,\n ...fact,\n })),\n );\n return result;\n });\n });\n }\n\n /**\n * The cacheable export URL for `selection` at the manifest's pins — the\n * base leaf while the layer inherits both planes the bundle depends on —\n * or `null` when a URL can't carry it: a URL has room for a few hundred\n * refs.\n */\n private exportPathAt(\n manifest: DocumentManifest,\n selection: AnnotationExportSelection,\n ): string | null {\n const token = {\n annotationsVersion: manifest.annotationsVersion,\n layoutVersion: manifest.layoutVersion,\n selection,\n };\n try {\n return planesInherited(manifest, ['annotations', 'layout'])\n ? wirePaths.docAnnotationsExport(this.docId, token)\n : wirePaths.layerAnnotationsExport(this.docId, this.layerName, token);\n } catch {\n return null;\n }\n }\n\n /** Versioned leaf URL for one manifest page entry, with the same\n * plane routing as `CloudPageAnnotationsService.list()`: an inherited\n * `annotations` plane reads the doc-level base leaf. */\n private pagePathAt(manifest: DocumentManifest, page: ManifestPage): string {\n const ref = page.page;\n return planesInherited(manifest, ['annotations'])\n ? wirePaths.docPageAnnotations(this.docId, ref, page.cache.annotationVersion)\n : wirePaths.layerPageAnnotations(\n this.docId,\n this.layerName,\n ref,\n page.cache.annotationVersion,\n );\n }\n\n private versionedPagePath(\n manifest: DocumentManifest,\n pageObjectNumber: PageObjectNumber,\n ): string {\n const page = manifest.pages.find((p) => p.page.objectNumber === pageObjectNumber);\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${pageObjectNumber} in document ${this.docId}`,\n );\n }\n return this.pagePathAt(manifest, page);\n }\n}\n","import type {\n WireAnnotationResources,\n WireResource,\n WireResourceMap,\n} from '@embedpdf/engine-core/runtime';\n\n/**\n * The multipart envelope of a write that carries files, in the shape every\n * multipart message has: the `body` part holds the JSON the plain request\n * would have been, which names each file by role\n * (`resources: { <role>: <key> }`), and each file is the part\n * `resource:<key>`.\n */\nexport function buildMutationForm(body: unknown, resources: WireResourceMap): FormData {\n const form = new FormData();\n form.append('body', JSON.stringify(body));\n for (const [key, resource] of Object.entries(resources)) {\n form.append(\n `resource:${key}`,\n new Blob([resource.bytes], { type: resource.mimeType ?? 'application/octet-stream' }),\n resource.name ?? key,\n );\n }\n return form;\n}\n\n/**\n * The envelope of a write with at most one file per role (an annotation's\n * drawing or attached file, a page insert's source PDF, a signature's\n * mark): each file's key is its role's name, and the body names it so,\n * `resources: { <role>: '<role>' }`.\n */\nexport function buildRoleMutationForm(\n body: object,\n files: Readonly<Record<string, WireResource | undefined>>,\n): FormData {\n const parts: WireResourceMap = {};\n const resources: Record<string, string> = {};\n for (const [role, file] of Object.entries(files)) {\n if (!file) continue;\n parts[role] = file;\n resources[role] = role;\n }\n return buildMutationForm(\n Object.keys(resources).length > 0 ? { ...body, resources } : body,\n parts,\n );\n}\n\n/** An annotation write's envelope: its drawing and attached file, by role. */\nexport function buildAnnotationMutationForm(\n body: object,\n resources: WireAnnotationResources,\n): FormData {\n return buildRoleMutationForm(body, {\n appearance: resources.appearance && { bytes: resources.appearance },\n file: resources.file && { bytes: resources.file },\n });\n}\n","import {\n EngineError,\n EngineErrorCode,\n type AttachmentContent,\n} from '@embedpdf/engine-core/runtime';\nimport { decodeTokenText } from '@embedpdf/engine-core/wire';\n\nimport type { HttpFileResponse } from '../transport/HttpClient';\n\n/** Header carrying the file's name, token-text encoded (names are\n * arbitrary UTF-8; HTTP header values are not). */\nconst FILE_NAME_HEADER = 'X-EmbedPDF-File-Name';\n/** Header carrying the file's declared type; absent when it has none. */\nconst FILE_TYPE_HEADER = 'X-EmbedPDF-File-Type';\n\n/**\n * Project an attachment-file response into `AttachmentContent`. The body\n * is the decoded bytes; the metadata rides as headers — `X-EmbedPDF-File-Type`\n * for the declared type (`Content-Type` is only what HTTP needs), and\n * `X-EmbedPDF-File-Name` for the file name.\n * Used by the document-level `attachments.download()`; the annotation-level\n * `annotations.downloadResource(ref, 'file')` reads the same response's bytes.\n */\nexport function parseAttachmentContent(file: HttpFileResponse): AttachmentContent {\n const encodedName = file.headers.get(FILE_NAME_HEADER);\n if (encodedName === null) {\n throw new EngineError(\n EngineErrorCode.WireFormat,\n `attachment response missing ${FILE_NAME_HEADER} header`,\n );\n }\n let name: string;\n try {\n name = decodeTokenText(encodedName);\n } catch (err) {\n throw new EngineError(\n EngineErrorCode.WireFormat,\n `malformed ${FILE_NAME_HEADER} header: ${(err as Error)?.message ?? err}`,\n { cause: err },\n );\n }\n return { bytes: file.bytes, name, mimeType: file.headers.get(FILE_TYPE_HEADER) };\n}\n","import {\n opIdOf,\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n deletedAttachmentOf,\n normalizeAttachmentFileSource,\n type AttachmentContent,\n type AttachmentCreateResult,\n type AttachmentDeleteResult,\n type AttachmentFileSource,\n type AttachmentList,\n type AttachmentRef,\n type DocumentAttachmentsService,\n type SessionEventPublisher,\n type WriteOptions,\n} from '@embedpdf/engine-core/runtime';\nimport {\n AttachmentCreateResultSchema,\n AttachmentDeleteResultSchema,\n AttachmentListSchema,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\n\nimport { buildMutationForm } from './buildMutationForm';\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { CloudWrites } from './CloudWrites';\nimport { planesInherited } from './planes';\nimport { parseAttachmentContent } from './parseAttachmentContent';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/** The `/attachments@…` listing leaf is a bare array of name-tree entries. */\n/**\n * Cloud-side document-level attachments (the catalog's `/EmbeddedFiles`\n * name tree). Reads use immutable leaves pinned by the manifest's\n * `attachmentsVersion`: `/attachments@…` for the metadata listing and\n * `/attachment-files/…@…` for one file's decoded bytes — a separate\n * capability tier, so a CDN credential for the listing can never egress\n * content. Mutations use unversioned collection/member URLs and are\n * never cached.\n */\nexport class CloudDocumentAttachmentsService implements DocumentAttachmentsService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n private readonly writes: CloudWrites,\n ) {}\n\n /**\n * Snapshot of the name tree, in tree (key-sorted) order. Pulls\n * `attachmentsVersion` from the cached manifest and, on a 404 (stale\n * pointer), transparently refreshes the manifest and retries once.\n * The pin bumps only on attachment writes, so this leaf stays cached\n * across page and annotation edits.\n */\n list(): AbortablePromise<AttachmentList> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AttachmentList>(async (signal) => {\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n // Plane-scope rule: the listing depends on the `attachments` plane —\n // while inherited, one CDN object serves every visitor's sidebar\n // from the base worker session.\n return planesInherited(manifest, ['attachments'])\n ? wirePaths.docAttachments(this.docId, manifest.attachmentsVersion)\n : wirePaths.layerAttachments(this.docId, this.layerName, manifest.attachmentsVersion);\n };\n return this.http.getJsonWithRefresh(\n buildPath,\n (raw) => AttachmentListSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n });\n }\n\n /**\n * Decode and return one embedded file's bytes. The body is the decoded\n * stream; the name and mime type ride as response headers (see\n * `parseAttachmentContent`). Same versioned-leaf + refresh-retry rails\n * as {@link list}.\n */\n download(ref: AttachmentRef): AbortablePromise<AttachmentContent> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AttachmentContent>(async (signal) => {\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n // Same plane switch as list(): the byte leaf shares too.\n return planesInherited(manifest, ['attachments'])\n ? wirePaths.docAttachmentFile(this.docId, ref.key, manifest.attachmentsVersion)\n : wirePaths.layerAttachmentFile(\n this.docId,\n this.layerName,\n ref.key,\n manifest.attachmentsVersion,\n );\n };\n const file = await this.http.getFileWithRefresh(\n buildPath,\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n return parseAttachmentContent(file);\n });\n }\n\n /**\n * Create an embedded file in the name tree: metadata into the `body`\n * part, naming its file `resources: { file: 'file' }`, and the bytes in\n * the part `resource:file`.\n */\n create(\n file: AttachmentFileSource,\n options?: WriteOptions,\n ): AbortablePromise<AttachmentCreateResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AttachmentCreateResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const { wireFile, resource } = await normalizeAttachmentFileSource(file, 'file');\n const result = await write.send((sent) =>\n this.http.postMultipartJson(\n wirePaths.layerAttachmentsCollection(this.docId, this.layerName),\n buildMutationForm(wireFile, { file: resource }),\n (raw) => AttachmentCreateResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n // Patch the cached manifest, then publish (in that order — listeners\n // reading the manifest in their callback must see post-mutation\n // state). An attachment write only advances docVersion +\n // attachmentsVersion (no per-page pin changes, no layoutVersion), so\n // the cached manifest is patched in place — no refetch.\n this.manifest.apply(result.meta, ['attachments']);\n this.publisher.publishWrite(opId, { type: 'attachments.created', ...result });\n return result;\n });\n });\n }\n\n /** Delete an embedded file from the name tree by its durable key. */\n delete(ref: AttachmentRef, options?: WriteOptions): AbortablePromise<AttachmentDeleteResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AttachmentDeleteResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.deleteJson(\n wirePaths.layerAttachmentItem(this.docId, this.layerName, ref.key),\n (raw) => AttachmentDeleteResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n // Same absorb-then-publish rails as create().\n this.manifest.apply(result.meta, ['attachments']);\n this.publisher.publishWrite(opId, {\n type: 'attachments.deleted',\n deleted: deletedAttachmentOf(result),\n ...result,\n });\n return result;\n });\n });\n }\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n changeEvents,\n deserializeError,\n isSkippedItem,\n isUndoChange,\n objectNumbersNamedBy,\n opIdOf,\n resolveChangeResources,\n type Change,\n type ChangeAnswer,\n type ChangeOp,\n type ChangeResult,\n type PageCoordinates,\n type SessionEventPublisher,\n type WireAnnotationResources,\n type WireResourceMap,\n type WriteOptions,\n} from '@embedpdf/engine-core/runtime';\nimport {\n CHANGE_REQUEST_LIMITS,\n ChangeRequestSchema,\n ChangeResponseSchema,\n wirePaths,\n type LayerScopePlane,\n} from '@embedpdf/engine-core/wire';\n\nimport { buildMutationForm } from './buildMutationForm';\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { ChangeSender, CloudWrites, SentChange } from './CloudWrites';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/** How many `opId`s a handle remembers having published: far more than any retry spans. */\nconst PUBLISHED_MEMORY = 4096;\n\n/**\n * `doc.apply` on the cloud: each change takes its place in the document's\n * line of writes, and goes out with the changes called right after it, as\n * one `POST …/changes` (see {@link CloudWrites.change}). The server checks\n * every op against the caller inside the write, so nothing about the ops is\n * checked here beyond what the request must hold.\n *\n * A change's events are published once its answer arrives, all sharing its\n * `opId`. A change asked again gets the first answer and publishes nothing:\n * this handle remembers the `opId`s it published.\n */\nexport class CloudDocumentChanges {\n /** The `opId`s this handle published events for, oldest first. */\n private readonly published = new Set<string>();\n\n constructor(\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n private readonly writes: CloudWrites,\n ) {}\n\n apply(change: Change, options?: WriteOptions): AbortablePromise<ChangeResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, 'document is closed'),\n );\n }\n let opId: string;\n try {\n opId = opIdOf(options);\n } catch (err) {\n return AbortablePromise.rejectReason(err);\n }\n // An empty change writes nothing, so nothing goes to the server.\n if (!isUndoChange(change) && change.ops.length === 0) {\n return AbortablePromise.resolveValue<ChangeResult>({\n items: [],\n meta: { affectedPages: [], cacheDelta: null, opId, undoable: false },\n });\n }\n return AbortablePromise.run<ChangeResult>(async (signal) => {\n // In line now, so it keeps its place among this document's writes while\n // its bytes are read.\n const answer = await this.writes.change(signal, sentChangeOf(opId, change), {\n named: objectNumbersNamedBy(change),\n alone: carriesBytes(change),\n });\n if (answer.status === 'refused') throw deserializeError(answer.error);\n this.absorb(opId, change, answer.result);\n return answer.result;\n });\n }\n\n /**\n * Patch the cached manifest, then publish the change's events (in that\n * order: listeners reading the manifest see the change), unless this\n * handle published them already.\n */\n private absorb(opId: string, change: Change, result: ChangeResult): void {\n this.manifest.apply(result.meta, planesOf(result));\n if (this.published.has(opId)) return;\n this.published.add(opId);\n if (this.published.size > PUBLISHED_MEMORY) {\n this.published.delete(this.published.values().next().value!);\n }\n const undoOf = isUndoChange(change) ? change.undoOf : undefined;\n this.publisher.publishChange(opId, changeEvents(result), undoOf);\n }\n}\n\n/**\n * The sender of a document's requests of changes: JSON, or multipart when\n * any change carries bytes, each op naming its parts by key.\n */\nexport function changeSender(http: HttpClient, docId: string, layerName: string): ChangeSender {\n const path = wirePaths.layerChanges(docId, layerName);\n // The schema checks the answers' shape; their types are core's.\n const parse = (raw: unknown) =>\n ChangeResponseSchema.parse(raw).changes as unknown as readonly ChangeAnswer[];\n return (changes, options) => {\n const { body, parts } = changeRequestOf(changes);\n // No caller's abort stops a request several changes share: once it's out,\n // every change in it is answered.\n const signal = new AbortController().signal;\n return Object.keys(parts).length > 0\n ? http.postMultipartJson(path, buildMutationForm(body, parts), parse, signal, options)\n : http.postJson(path, body, parse, signal, options);\n };\n}\n\n/**\n * A change ready to send: its bytes read, and checked against what a request\n * may hold, so a malformed change is refused alone rather than refusing the\n * request it would share.\n */\nasync function sentChangeOf(opId: string, change: Change): Promise<SentChange> {\n if (!isUndoChange(change) && change.ops.length > CHANGE_REQUEST_LIMITS.ops) {\n throw new EngineError(\n EngineErrorCode.PayloadTooLarge,\n `a change holds at most ${CHANGE_REQUEST_LIMITS.ops} ops`,\n { details: { limit: 'ops', max: CHANGE_REQUEST_LIMITS.ops, value: change.ops.length } },\n );\n }\n const sent: SentChange = { opId, change: (await resolveChangeResources(change)).change };\n // Checked as the server reads it: the JSON, after serialization.\n const { body } = changeRequestOf([sent]);\n const checked = ChangeRequestSchema.safeParse(JSON.parse(JSON.stringify(body)));\n if (!checked.success) {\n throw new EngineError(EngineErrorCode.InvalidArg, `invalid change: ${checked.error.message}`, {\n details: { issues: checked.error.issues },\n });\n }\n return sent;\n}\n\n/** A request's JSON and its parts: each op's bytes become a part the op names by key. */\nfunction changeRequestOf(changes: readonly SentChange[]): {\n body: { changes: unknown[] };\n parts: WireResourceMap;\n} {\n const parts: WireResourceMap = {};\n const part = (bytes: ArrayBuffer): string => {\n const key = `r${Object.keys(parts).length}`;\n parts[key] = { bytes };\n return key;\n };\n const opOf = (op: ChangeOp<PageCoordinates, WireAnnotationResources>): unknown => {\n switch (op.type) {\n case 'annotations.create':\n case 'annotations.update': {\n if (!op.resources) return op;\n const { appearance, file } = op.resources;\n return {\n ...op,\n resources: {\n ...(appearance ? { appearance: part(appearance) } : {}),\n ...(file ? { file: part(file) } : {}),\n },\n };\n }\n case 'forms.setSignatureAppearance': {\n const { appearance, ...rest } = op;\n return {\n ...rest,\n resources: { appearance: part(appearance.pdf.slice().buffer as ArrayBuffer) },\n };\n }\n default:\n return op;\n }\n };\n const body = {\n changes: changes.map(({ opId, change }) =>\n isUndoChange(change) ? { opId, undoOf: change.undoOf } : { opId, ops: change.ops.map(opOf) },\n ),\n };\n return { body, parts };\n}\n\n/** Whether a change carries bytes: a drawing, an attached file, a signature's artwork. */\nfunction carriesBytes(change: Change): boolean {\n if (isUndoChange(change)) return false;\n return change.ops.some(\n (op) =>\n op.type === 'forms.setSignatureAppearance' ||\n ((op.type === 'annotations.create' || op.type === 'annotations.update') &&\n op.resources !== undefined &&\n Object.values(op.resources).some((resource) => resource !== undefined)),\n );\n}\n\n/** The planes a change's writes took over from the base, each op by its family. */\nfunction planesOf(result: ChangeResult): LayerScopePlane[] {\n const planes = new Set<LayerScopePlane>();\n for (const item of result.items) {\n if (isSkippedItem(item)) continue;\n if (item.type.startsWith('metadata.')) planes.add('metadata');\n else if (item.type.startsWith('forms.')) planes.add('forms');\n else planes.add('annotations');\n }\n return [...planes];\n}\n","/**\n * `path` with the object numbers a create names, in its query string: one\n * (`objectNumber=42`) or a comma list (`objectNumbers=42,43`). The body\n * stays the data. Names whose value is absent are left out.\n */\nexport function withObjectNumbers(\n path: string,\n numbers: Readonly<Record<string, number | readonly number[] | undefined>>,\n): string {\n const query = Object.entries(numbers)\n .filter(([, value]) => value !== undefined && (!Array.isArray(value) || value.length > 0))\n .map(([name, value]) => `${name}=${Array.isArray(value) ? value.join(',') : String(value)}`);\n if (query.length === 0) return path;\n return `${path}${path.includes('?') ? '&' : '?'}${query.join('&')}`;\n}\n","import {\n opIdOf,\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n deletedFieldOf,\n encodeFieldRefKey,\n formImportFacts,\n formResetFacts,\n formValuesImportFacts,\n assertFormBundle,\n assertFormBundleManifest,\n type BundleLimits,\n type DocumentEventInit,\n type DocumentFormsService,\n type DocumentManifest,\n type FormBundle,\n type FormExportSelection,\n type FormFieldCreateResult,\n type FormFieldDeleteResult,\n type FormFieldDraft,\n type FormFieldDTO,\n type FormFieldPatch,\n type FormFieldRef,\n type FormFieldUpdateResult,\n type SessionEventPublisher,\n type SignatureAppearanceInput,\n type FormFieldValue,\n type FormImportBody,\n type FormImportOptions,\n type FormImportResult,\n type FormValuesImportBody,\n type FormValuesImportOptions,\n type FormValuesImportResult,\n type FormRepairOptions,\n type FormRepairResult,\n type FormSetValueResult,\n type FormSnapshot,\n type FormWidgetLinkResult,\n type FormWidgetDeleteResult,\n type FormWidgetUpdateResult,\n type FormWidgetsReorderResult,\n type FormCalculationsReorderResult,\n type FieldPosition,\n type WidgetPatch,\n encodeAnnotKey,\n type AnnotationPosition,\n type AnnotationRef,\n type MutationMeta,\n type FormResetResult,\n type WidgetPlacement,\n type WriteOptions,\n type FormFieldCreateOptions,\n type FormWidgetAddOptions,\n} from '@embedpdf/engine-core/runtime';\nimport {\n FormFieldCreateResultSchema,\n FormFieldDeleteResultSchema,\n FormFieldDTOSchema,\n FormFieldUpdateResultSchema,\n FormImportResultSchema,\n FormValuesImportResultSchema,\n FormRepairResultSchema,\n FormResetResultSchema,\n FormSetValueResultSchema,\n FormSnapshotSchema,\n FormWidgetLinkResultSchema,\n FormWidgetDeleteResultSchema,\n FormWidgetUpdateResultSchema,\n FormWidgetsReorderResultSchema,\n FormCalculationsReorderResultSchema,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\n\nimport { buildRoleMutationForm } from './buildMutationForm';\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { CloudWrites } from './CloudWrites';\nimport { planesInherited } from './planes';\nimport { withObjectNumbers } from '../shared/withObjectNumbers';\nimport { bundleImportForm, NO_BUNDLE_LIMITS, readBundleParts } from '../transport/bundleMultipart';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Cloud-side document forms service. Mirrors the local wiring: each call\n * produces an `AbortablePromise` that propagates `signal.abort()` down to\n * `fetch` and validates the JSON response with the wire-stable Zod schema.\n *\n * The form is its own read family: `list()` reads the immutable `form@`\n * leaf at the manifest's `formsVersion`. Mutation results carry the\n * `cacheDelta` of the form's pins (`formsVersion`, and each changed widget\n * page's `widgetVersion`); `absorbMutation` folds it into the cached\n * manifest and owns the `forms` plane.\n */\nexport class CloudDocumentFormsService implements DocumentFormsService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n private readonly writes: CloudWrites,\n /** The server's import limits, as its `/v1/access` advertises them. */\n private readonly importLimits: () => Promise<BundleLimits>,\n ) {}\n\n /**\n * The form: one read of the immutable `form@formsVersion=N` leaf at the\n * manifest's pin, at the base's URL while the layer inherits the `forms`\n * plane, CDN-cacheable because the pin moves only when the form does. A\n * stale pin (a write landed → 404) refreshes the manifest and reads again,\n * once.\n */\n list(): AbortablePromise<FormSnapshot> {\n const rejected = this.rejectIfClosed<FormSnapshot>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormSnapshot>((signal) =>\n this.http.getJsonWithRefresh(\n async (s) => {\n const manifest = await this.manifest.get(s);\n return planesInherited(manifest, ['forms'])\n ? wirePaths.docForm(this.docId, manifest.formsVersion)\n : wirePaths.layerForm(this.docId, this.layerName, manifest.formsVersion);\n },\n (raw) => FormSnapshotSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n ),\n );\n }\n\n get(ref: FormFieldRef): AbortablePromise<FormFieldDTO> {\n const rejected = this.rejectIfClosed<FormFieldDTO>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormFieldDTO>((signal) =>\n this.http.getJson(\n wirePaths.layerFormFieldByKey(this.docId, this.layerName, encodeFieldRefKey(ref)),\n (raw) => FormFieldDTOSchema.parse(raw),\n signal,\n ),\n );\n }\n\n setValue(\n ref: FormFieldRef,\n value: FormFieldValue,\n options?: WriteOptions,\n ): AbortablePromise<FormSetValueResult> {\n const rejected = this.rejectIfClosed<FormSetValueResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormSetValueResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n wirePaths.layerFormFieldValue(this.docId, this.layerName, encodeFieldRefKey(ref)),\n { value },\n (raw) => FormSetValueResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n return this.absorbMutation(opId, result, 'forms.valueSet');\n });\n });\n }\n\n reset(\n fields?: FormFieldRef | FormFieldRef[],\n options?: WriteOptions,\n ): AbortablePromise<FormResetResult> {\n const rejected = this.rejectIfClosed<FormResetResult>();\n if (rejected) return rejected;\n const refs = fields === undefined ? undefined : Array.isArray(fields) ? fields : [fields];\n return AbortablePromise.run<FormResetResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n wirePaths.layerFormReset(this.docId, this.layerName),\n refs ? { refs } : {},\n (raw) => FormResetResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n this.manifest.apply(result.meta, ['forms']);\n // One event per field that changed, sharing the write's opId.\n this.publisher.publishWrite(\n opId,\n ...formResetFacts(result).map((fact) => ({ type: 'forms.valueSet' as const, ...fact })),\n );\n return result;\n });\n });\n }\n\n /**\n * One versioned, CDN-cacheable read at the manifest's form and layout\n * pins, with the stale-pin retry (404 → refresh the manifest → once). The\n * response is the bundle without its bytes and one part per resource;\n * every part is checked against its id before it is returned.\n */\n export(selection: FormExportSelection = {}): AbortablePromise<FormBundle> {\n const rejected = this.rejectIfClosed<FormBundle>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormBundle>(async (signal) => {\n const read = async (s: AbortSignal): Promise<FormData> => {\n const manifest = await this.manifest.get(s);\n const path = this.exportPathAt(manifest, selection);\n if (path) return this.http.getFormData(path, s);\n // More fields than a URL holds: the pins and the selection in a\n // POST body.\n return this.http.postJsonFormData(\n wirePaths.layerFormExportRequest(this.docId, this.layerName),\n {\n formsVersion: manifest.formsVersion,\n layoutVersion: manifest.layoutVersion,\n selection,\n },\n s,\n );\n };\n let form: FormData;\n try {\n form = await read(signal);\n } catch (error) {\n // A pin that moved since the manifest was read: read it again, once.\n if (!EngineError.is(error, EngineErrorCode.NotFound)) throw error;\n await this.manifest.refresh(signal);\n form = await read(signal);\n }\n const { body, resources } = await readBundleParts('form', form);\n const bundle = { ...(body as Omit<FormBundle, 'resources'>), resources };\n await assertFormBundle(bundle, NO_BUNDLE_LIMITS);\n return bundle;\n });\n }\n\n /**\n * One request: the bundle's manifest and each resource once, as parts of\n * one multipart POST under the import's `opId` as `Idempotency-Key`, so a\n * retry applies once. The server holds the limits; the same numbers are\n * checked here first, so a bundle past one fails before its bytes move.\n */\n import(bundle: FormBundle, options: FormImportOptions = {}): AbortablePromise<FormImportResult> {\n const rejected = this.rejectIfClosed<FormImportResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormImportResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const body: FormImportBody = {\n bundle: await this.checkedManifest(bundle),\n options: {\n ...(options.pages !== undefined ? { pages: options.pages } : {}),\n ...(options.attribution !== undefined ? { attribution: options.attribution } : {}),\n ...(options.values !== undefined ? { values: options.values } : {}),\n },\n };\n const result = await write.send((sent) =>\n this.http.postMultipartJson(\n wirePaths.layerFormImport(this.docId, this.layerName),\n bundleImportForm(body, bundle.resources),\n (raw) => FormImportResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n this.manifest.apply(result.meta, ['forms']);\n // One event per field it made, sharing the import's opId.\n this.publisher.publishWrite(\n opId,\n ...formImportFacts(result).map((fact) => ({\n type: 'forms.created' as const,\n ...fact,\n })),\n );\n return result;\n });\n });\n }\n\n /** One request, as {@link import} sends it. */\n importValues(\n bundle: FormBundle,\n options: FormValuesImportOptions = {},\n ): AbortablePromise<FormValuesImportResult> {\n const rejected = this.rejectIfClosed<FormValuesImportResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormValuesImportResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const body: FormValuesImportBody = {\n bundle: await this.checkedManifest(bundle),\n options: options.attribution !== undefined ? { attribution: options.attribution } : {},\n };\n const result = await write.send((sent) =>\n this.http.postMultipartJson(\n wirePaths.layerFormImportValues(this.docId, this.layerName),\n bundleImportForm(body, bundle.resources),\n (raw) => FormValuesImportResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n this.manifest.apply(result.meta, ['forms']);\n // One event per field it filled, sharing the import's opId.\n this.publisher.publishWrite(\n opId,\n ...formValuesImportFacts(result).map((fact) => ({\n type: 'forms.valueSet' as const,\n ...fact,\n })),\n );\n return result;\n });\n });\n }\n\n create(\n draft: FormFieldDraft,\n options: FormFieldCreateOptions = {},\n ): AbortablePromise<FormFieldCreateResult> {\n const rejected = this.rejectIfClosed<FormFieldCreateResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormFieldCreateResult>(async (signal) => {\n const opId = opIdOf(options);\n const { objectNumber, widgetObjectNumbers } = options;\n return this.writes.run(\n opId,\n signal,\n async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n withObjectNumbers(wirePaths.layerFormFields(this.docId, this.layerName), {\n objectNumber,\n widgetObjectNumbers,\n }),\n draft,\n (raw) => FormFieldCreateResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n return this.absorbMutation(opId, result, 'forms.created');\n },\n [objectNumber, ...(widgetObjectNumbers ?? [])],\n );\n });\n }\n\n update(\n ref: FormFieldRef,\n patch: FormFieldPatch,\n options?: WriteOptions,\n ): AbortablePromise<FormFieldUpdateResult> {\n const rejected = this.rejectIfClosed<FormFieldUpdateResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormFieldUpdateResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.patchJson(\n wirePaths.layerFormFieldByKey(this.docId, this.layerName, encodeFieldRefKey(ref)),\n patch,\n (raw) => FormFieldUpdateResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n return this.absorbMutation(opId, result, 'forms.updated');\n });\n });\n }\n\n setSignatureAppearance(\n ref: FormFieldRef,\n appearance: SignatureAppearanceInput,\n options?: WriteOptions,\n ): AbortablePromise<FormFieldUpdateResult> {\n const rejected = this.rejectIfClosed<FormFieldUpdateResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormFieldUpdateResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const bytes = new ArrayBuffer(appearance.pdf.byteLength);\n new Uint8Array(bytes).set(appearance.pdf);\n const form = buildRoleMutationForm(\n {},\n { appearance: { bytes, mimeType: 'application/pdf', name: 'appearance.pdf' } },\n );\n const result = await write.send((sent) =>\n this.http.postMultipartJson(\n wirePaths.layerFormFieldSignatureAppearance(\n this.docId,\n this.layerName,\n encodeFieldRefKey(ref),\n ),\n form,\n (raw) => FormFieldUpdateResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n return this.absorbMutation(opId, result, 'forms.updated');\n });\n });\n }\n\n delete(ref: FormFieldRef, options?: WriteOptions): AbortablePromise<FormFieldDeleteResult> {\n const rejected = this.rejectIfClosed<FormFieldDeleteResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormFieldDeleteResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.deleteJson(\n wirePaths.layerFormFieldByKey(this.docId, this.layerName, encodeFieldRefKey(ref)),\n (raw) => FormFieldDeleteResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n this.manifest.apply(result.meta, ['forms']);\n this.publisher.publishWrite(opId, {\n type: 'forms.deleted',\n deleted: deletedFieldOf(result),\n ...result,\n });\n return result;\n });\n });\n }\n\n addWidget(\n ref: FormFieldRef,\n placement: WidgetPlacement,\n options: FormWidgetAddOptions = {},\n ): AbortablePromise<FormWidgetLinkResult> {\n const rejected = this.rejectIfClosed<FormWidgetLinkResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormWidgetLinkResult>(async (signal) => {\n const opId = opIdOf(options);\n const { objectNumber, splitObjectNumber } = options;\n return this.writes.run(\n opId,\n signal,\n async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n withObjectNumbers(\n wirePaths.layerFormFieldWidgets(this.docId, this.layerName, encodeFieldRefKey(ref)),\n { objectNumber, splitObjectNumber },\n ),\n placement,\n (raw) => FormWidgetLinkResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n return this.absorbMutation(opId, result, 'forms.widgetAdded');\n },\n [objectNumber, splitObjectNumber],\n );\n });\n }\n\n removeWidget(\n ref: FormFieldRef,\n widget: AnnotationRef,\n options?: WriteOptions,\n ): AbortablePromise<FormWidgetLinkResult> {\n const rejected = this.rejectIfClosed<FormWidgetLinkResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormWidgetLinkResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n wirePaths.layerFormFieldWidgetsDetach(\n this.docId,\n this.layerName,\n encodeFieldRefKey(ref),\n ),\n { widget },\n (raw) => FormWidgetLinkResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n return this.absorbMutation(opId, result, 'forms.widgetRemoved');\n });\n });\n }\n\n updateWidget(\n widget: AnnotationRef,\n patch: WidgetPatch,\n options?: WriteOptions,\n ): AbortablePromise<FormWidgetUpdateResult> {\n const rejected = this.rejectIfClosed<FormWidgetUpdateResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormWidgetUpdateResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.patchJson(\n wirePaths.layerFormWidget(\n this.docId,\n this.layerName,\n widget.page,\n encodeAnnotKey(widget),\n ),\n { patch },\n (raw) => FormWidgetUpdateResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n return this.absorbMutation(opId, result, 'forms.widgetUpdated');\n });\n });\n }\n\n deleteWidget(\n widget: AnnotationRef,\n options?: WriteOptions,\n ): AbortablePromise<FormWidgetDeleteResult> {\n const rejected = this.rejectIfClosed<FormWidgetDeleteResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormWidgetDeleteResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.deleteJson(\n wirePaths.layerFormWidget(\n this.docId,\n this.layerName,\n widget.page,\n encodeAnnotKey(widget),\n ),\n (raw) => FormWidgetDeleteResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n return this.absorbMutation(opId, result, 'forms.widgetDeleted');\n });\n });\n }\n\n reorderCalculations(\n fields: FormFieldRef[],\n position: FieldPosition,\n options?: WriteOptions,\n ): AbortablePromise<FormCalculationsReorderResult> {\n const rejected = this.rejectIfClosed<FormCalculationsReorderResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormCalculationsReorderResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n wirePaths.layerFormCalculationsReorder(this.docId, this.layerName),\n { fields, position },\n (raw) => FormCalculationsReorderResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n return this.absorbMutation(opId, result, 'forms.calculationsReordered');\n });\n });\n }\n\n reorderWidgets(\n widgets: AnnotationRef[],\n position: AnnotationPosition,\n options?: WriteOptions,\n ): AbortablePromise<FormWidgetsReorderResult> {\n const rejected = this.rejectIfClosed<FormWidgetsReorderResult>();\n if (rejected) return rejected;\n // The widgets' page is part of the URL; the server checks they are all on it.\n const page = widgets[0]?.page;\n if (!page) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.InvalidArg, 'a reorder names at least one widget', {\n details: { field: 'widgets' },\n }),\n );\n }\n return AbortablePromise.run<FormWidgetsReorderResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n wirePaths.layerFormWidgetsReorder(this.docId, this.layerName, page),\n { widgets, position },\n (raw) => FormWidgetsReorderResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n return this.absorbMutation(opId, result, 'forms.widgetsReordered');\n });\n });\n }\n\n repair(options?: FormRepairOptions): AbortablePromise<FormRepairResult> {\n const rejected = this.rejectIfClosed<FormRepairResult>();\n if (rejected) return rejected;\n return AbortablePromise.run<FormRepairResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n wirePaths.layerFormRepair(this.docId, this.layerName),\n { bakeAppearances: options?.bakeAppearances ?? false },\n (raw) => FormRepairResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n return this.absorbMutation(opId, result, 'forms.repaired');\n });\n });\n }\n\n /** The bundle without its bytes, checked against the server's limits first. */\n private async checkedManifest(bundle: FormBundle): Promise<Omit<FormBundle, 'resources'>> {\n const { resources, ...manifest } = bundle;\n const sizes = new Map(Object.entries(resources).map(([id, bytes]) => [id, bytes.length]));\n assertFormBundleManifest(bundle, sizes, await this.importLimits());\n return manifest;\n }\n\n /**\n * The cacheable export URL for `selection` at the manifest's pins — the\n * base leaf while the layer inherits both planes the bundle depends on —\n * or `null` when a URL can't carry it.\n */\n private exportPathAt(manifest: DocumentManifest, selection: FormExportSelection): string | null {\n const token = {\n formsVersion: manifest.formsVersion,\n layoutVersion: manifest.layoutVersion,\n selection,\n };\n try {\n return planesInherited(manifest, ['forms', 'layout'])\n ? wirePaths.docFormExport(this.docId, token)\n : wirePaths.layerFormExport(this.docId, this.layerName, token);\n } catch {\n return null;\n }\n }\n\n private rejectIfClosed<T>(): AbortablePromise<T> | null {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return null;\n }\n\n /**\n * Patch the cached manifest, then publish the mutation to the document's\n * event stream (in that order — listeners reading the manifest in their\n * callback must see post-mutation state). Same rails as annotations.\n */\n private absorbMutation<T extends { meta: MutationMeta }>(\n opId: string,\n result: T,\n type:\n | 'forms.valueSet'\n | 'forms.repaired'\n | 'forms.created'\n | 'forms.updated'\n | 'forms.widgetAdded'\n | 'forms.widgetRemoved'\n | 'forms.widgetUpdated'\n | 'forms.widgetDeleted'\n | 'forms.widgetsReordered'\n | 'forms.calculationsReordered',\n ): T {\n this.manifest.apply(result.meta, ['forms']);\n this.publisher.publishWrite(opId, { type, ...result } as unknown as DocumentEventInit);\n return result;\n }\n}\n","import { AbortError } from '@embedpdf/engine-core/runtime';\n\n/**\n * Wait for a shared promise under one caller's signal: an abort rejects\n * this caller only and leaves the shared work running for the others.\n */\nexport function awaitSignal<T>(promise: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) {\n return Promise.reject(new AbortError(signal.reason));\n }\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n reject(new AbortError(signal.reason));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (value) => {\n signal.removeEventListener('abort', onAbort);\n resolve(value);\n },\n (reason) => {\n signal.removeEventListener('abort', onAbort);\n reject(reason);\n },\n );\n });\n}\n","import {\n opIdOf,\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type DocumentPagesService,\n type PageFlattenResult,\n type PageDeleteResult,\n type PageInsertBlankSpec,\n type PageInsertResult,\n type PageLayout,\n type PageListSnapshot,\n type PagePosition,\n type PageReorderResult,\n type PageNameInput,\n type PageNameResult,\n type PageRef,\n type PageRemoveNameInput,\n type PageRotateResult,\n type PdfRotation,\n pageRefsEqual,\n type SessionEventPublisher,\n type WriteOptions,\n type FlattenWriteOptions,\n type PageInsertBlankOptions,\n} from '@embedpdf/engine-core/runtime';\nimport {\n PageDeleteResultSchema,\n PageFlattenResultSchema,\n PageInsertResultSchema,\n PageListSnapshotSchema,\n PageReorderResultSchema,\n PageNameResultSchema,\n PageRotateResultSchema,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\n\nimport { buildRoleMutationForm } from './buildMutationForm';\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { CloudWrites } from './CloudWrites';\nimport { planesInherited } from './planes';\nimport { awaitSignal } from '../shared/awaitSignal';\nimport { withObjectNumbers } from '../shared/withObjectNumbers';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/** Detach a Uint8Array view into a standalone ArrayBuffer (the resource-map\n * shape) without disturbing a larger buffer the caller still owns. */\nfunction copyToExactBuffer(view: Uint8Array): ArrayBuffer {\n const copy = new ArrayBuffer(view.byteLength);\n new Uint8Array(copy).set(view);\n return copy;\n}\n\n/**\n * Cloud-side document pages service. Mirrors `LocalDocumentPagesService`\n * over HTTP: GET /pages for `list`, POST /pages/reorder for the reorder.\n *\n * Page identity rule (locked with the user, do not change):\n * - Pages are addressed exclusively by `PageRef` (their indirect\n * `pageObjectNumber`); mutation bodies ship `{ pages: PageRef[] }`.\n * The wire never sends a page index for a mutation. This keeps\n * multi-call client logic from having to account for index drift\n * between requests.\n * - Successful `reorder()` returns the new `layout` (order + geometry) plus\n * cloud coherence pins. A page reorder bumps only `docVersion` +\n * `layoutVersion`; every per-page pin stays warm.\n */\nexport class CloudDocumentPagesService implements DocumentPagesService {\n /** The last layout leaf read by {@link pageLayout}, keyed by its URL path. */\n private layoutMemo: { path: string; snapshot: Promise<PageListSnapshot> } | null = null;\n\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n private readonly writes: CloudWrites,\n ) {}\n\n /**\n * Page-geometry list. The geometry bytes live at the content-addressed\n * `/layout@layoutVersion=N` leaf (not in the manifest); the manifest only\n * publishes the `layoutVersion` pointer. So `list()` reads `layoutVersion`\n * from the cached manifest, fetches the layout leaf, and on a 404 (stale\n * pointer) transparently refreshes the manifest and retries once — the\n * same ladder the per-page text/geometry reads use. `layoutVersion` bumps\n * only on structural page ops, so this leaf stays cached across content\n * and annotation edits.\n */\n list(): AbortablePromise<PageListSnapshot> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageListSnapshot>((signal) => this.fetchLayout(signal));\n }\n\n /**\n * One page's layout, for renders to size their image without a round\n * trip per tile. The layout leaf never changes at a given URL, so the\n * last one read is kept and shared until the manifest points elsewhere.\n */\n async pageLayout(ref: PageRef, signal: AbortSignal): Promise<PageLayout> {\n const path = await this.layoutPath(signal);\n let memo = this.layoutMemo;\n if (memo?.path !== path) {\n // Not tied to this caller's signal: one caller's cancel must not\n // fail the others waiting on the same read.\n const snapshot = this.fetchLayout(new AbortController().signal);\n const next = { path, snapshot };\n snapshot.catch(() => {\n if (this.layoutMemo === next) this.layoutMemo = null;\n });\n this.layoutMemo = memo = next;\n }\n const snapshot = await awaitSignal(memo.snapshot, signal);\n const page = snapshot.pages.find((p) => pageRefsEqual(p.ref, ref));\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${ref.objectNumber} in document ${this.docId}`,\n );\n }\n return page;\n }\n\n /**\n * Plane-scope rule: the layout leaf depends on the `layout` plane —\n * while inherited (no reorder/rotate/insert/delete ever ran), every\n * visitor's page list is one doc-level URL served from the base\n * session; the SDK open sequence creates no layer session.\n */\n private async layoutPath(signal: AbortSignal): Promise<string> {\n const manifest = await this.manifest.get(signal);\n return planesInherited(manifest, ['layout'])\n ? wirePaths.docLayout(this.docId, manifest.layoutVersion)\n : wirePaths.layerLayout(this.docId, this.layerName, manifest.layoutVersion);\n }\n\n private fetchLayout(signal: AbortSignal): Promise<PageListSnapshot> {\n return this.http.getJsonWithRefresh(\n (s) => this.layoutPath(s),\n (raw) => PageListSnapshotSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n }\n\n reorder(\n pages: PageRef[],\n position: PagePosition,\n options?: WriteOptions,\n ): AbortablePromise<PageReorderResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageReorderResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n wirePaths.layerPagesReorder(this.docId, this.layerName),\n { pages, position },\n (raw) => PageReorderResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n // A reorder only advances docVersion + layoutVersion (no per-page pin\n // changes), so the cached manifest can be patched in place — no refetch.\n this.manifest.apply(result.meta, ['layout']);\n // Publish after absorb: listeners reading the manifest in their\n // callback must see post-mutation state.\n this.publisher.publishWrite(opId, { type: 'pages.reordered', ...result });\n return result;\n });\n });\n }\n\n setName(input: PageNameInput, options?: WriteOptions): AbortablePromise<PageNameResult> {\n return this.runNameMutation(\n wirePaths.layerPagesNames(this.docId, this.layerName),\n input,\n input.name,\n input.page,\n options,\n );\n }\n\n removeName(input: PageRemoveNameInput, options?: WriteOptions): AbortablePromise<PageNameResult> {\n return this.runNameMutation(\n wirePaths.layerPagesNamesDelete(this.docId, this.layerName),\n input,\n input.name,\n null,\n options,\n );\n }\n\n /**\n * Named pages are layout: both verbs share the page-reorder patch exactly —\n * docVersion + layoutVersion advance, no per-page pin changes, so the\n * cached manifest is patched in place and the fresh layout is published.\n */\n private runNameMutation(\n path: string,\n body: PageNameInput | PageRemoveNameInput,\n name: string,\n page: PageRef | null,\n options: WriteOptions | undefined,\n ): AbortablePromise<PageNameResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageNameResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(path, body, (raw) => PageNameResultSchema.parse(raw), signal, sent),\n );\n this.manifest.apply(result.meta, ['layout']);\n this.publisher.publishWrite(opId, { type: 'pages.named', name, page, ...result });\n return result;\n });\n });\n }\n\n rotate(\n pages: PageRef[],\n rotation: PdfRotation,\n options?: WriteOptions,\n ): AbortablePromise<PageRotateResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageRotateResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n wirePaths.layerPagesRotate(this.docId, this.layerName),\n { pages, rotation },\n (raw) => PageRotateResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n // Rotation shares the reorder patch exactly: docVersion + layoutVersion\n // advance, every per-page pin (and its cached render) stays warm.\n this.manifest.apply(result.meta, ['layout']);\n this.publisher.publishWrite(opId, { type: 'pages.rotated', pages, rotation, ...result });\n return result;\n });\n });\n }\n\n delete(pages: PageRef[], options?: WriteOptions): AbortablePromise<PageDeleteResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageDeleteResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n wirePaths.layerPagesDelete(this.docId, this.layerName),\n { pages },\n (raw) => PageDeleteResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n // The structural advance plus dropping the deleted pages' manifest\n // rows — a retired page object number must not be buildable from the local cache.\n this.manifest.applyPageDelete(result.meta, pages);\n this.publisher.publishWrite(opId, { type: 'pages.deleted', pages, ...result });\n return result;\n });\n });\n }\n\n insert(\n bytes: Uint8Array | ArrayBuffer,\n position: PagePosition = 'end',\n options?: WriteOptions,\n ): AbortablePromise<PageInsertResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageInsertResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n // The body names the source PDF by its role, `resources: { source }`.\n const buffer = bytes instanceof ArrayBuffer ? bytes : copyToExactBuffer(bytes);\n const form = buildRoleMutationForm(\n { position },\n {\n source: { bytes: buffer, mimeType: 'application/pdf', name: 'source.pdf' },\n },\n );\n const result = await write.send((sent) =>\n this.http.postMultipartJson(\n wirePaths.layerPagesInsert(this.docId, this.layerName),\n form,\n (raw) => PageInsertResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n // Insert changes the page set: the cached manifest has no rows for\n // the fresh page object numbers, so the absorb drops it for a lazy refetch (the\n // result already carries the full new layout — nothing waits).\n this.manifest.applyPageInsert(result.meta);\n this.publisher.publishWrite(opId, { type: 'pages.inserted', ...result });\n return result;\n });\n });\n }\n\n insertBlank(\n spec: PageInsertBlankSpec,\n position: PagePosition = 'end',\n options: PageInsertBlankOptions = {},\n ): AbortablePromise<PageInsertResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageInsertResult>(async (signal) => {\n const opId = opIdOf(options);\n const { objectNumbers } = options;\n return this.writes.run(\n opId,\n signal,\n async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n withObjectNumbers(wirePaths.layerPagesInsertBlank(this.docId, this.layerName), {\n objectNumbers,\n }),\n {\n size: spec.size,\n ...(spec.count !== undefined ? { count: spec.count } : {}),\n position,\n },\n (raw) => PageInsertResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n this.manifest.applyPageInsert(result.meta);\n this.publisher.publishWrite(opId, { type: 'pages.inserted', ...result });\n return result;\n },\n objectNumbers ?? [],\n );\n });\n }\n\n extract(pages: PageRef[]): AbortablePromise<Uint8Array> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n // A read (gated by doc.download server-side): no absorb, no event —\n // nothing about the document changed.\n return AbortablePromise.run<Uint8Array>(async (signal) =>\n this.http.postJsonBytes(\n wirePaths.layerPagesExtract(this.docId, this.layerName),\n { pages },\n signal,\n ),\n );\n }\n\n flatten(pages: PageRef[], options?: FlattenWriteOptions): AbortablePromise<PageFlattenResult> {\n const usage = options?.usage ?? 'display';\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageFlattenResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n wirePaths.layerPagesFlatten(this.docId, this.layerName),\n { pages, usage },\n (raw) => PageFlattenResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n // Nothing flattened comes back without a cache delta: no artifact, no\n // coherence bump, no event.\n if (result.meta.cacheDelta === null) return result;\n // Flatten bakes annotations and form fields into page content.\n this.manifest.apply(result.meta, ['content', 'annotations', 'forms']);\n this.publisher.publishWrite(opId, {\n type: 'pages.flattened',\n ...result,\n });\n return result;\n });\n });\n }\n}\n","import {\n opIdOf,\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type DocumentRedactionService,\n type RedactionApplyResult,\n type RedactionApplyScope,\n type SessionEventPublisher,\n type WriteOptions,\n} from '@embedpdf/engine-core/runtime';\nimport { RedactionApplyResultSchema, wirePaths } from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { CloudWrites } from './CloudWrites';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Cloud-side redaction apply. Mirrors `LocalDocumentRedactionService` over\n * HTTP (POST /redactions/apply); the server enforces the capability gate\n * (`doc.pages.modify` + `doc.annotate.modify` + `doc.redact`) and persists\n * the rewritten layer artifact. See `DocumentRedactionService` for the\n * two-stage model and the layer trust boundary — an apply rewrites this\n * layer's bytes; the immutable base keeps the original.\n */\nexport class CloudDocumentRedactionService implements DocumentRedactionService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n private readonly writes: CloudWrites,\n ) {}\n\n apply(\n scope: RedactionApplyScope,\n options?: WriteOptions,\n ): AbortablePromise<RedactionApplyResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<RedactionApplyResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n wirePaths.layerRedactionsApply(this.docId, this.layerName),\n scope,\n (raw) => RedactionApplyResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n // Nothing applied comes back without a cache delta: no artifact, no\n // coherence bump, no event.\n if (result.meta.cacheDelta === null) return result;\n // Redaction-apply rewrites content and consumes the marks, so both\n // planes flip.\n this.manifest.apply(result.meta, ['content', 'annotations', 'forms']);\n this.publisher.publishWrite(opId, {\n type: 'redaction.applied',\n ...result,\n });\n return result;\n });\n });\n }\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n canonicalSearchQuery,\n searchContentEpoch,\n type DocumentSearchService,\n type SearchQuery,\n type SearchRequest,\n type SearchSlice,\n} from '@embedpdf/engine-core/runtime';\nimport {\n SearchSliceSchema,\n decodeSearchToken,\n encodeSearchToken,\n wirePaths,\n type SearchToken,\n} from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Cloud search transport: versioned GETs, one per budgeted slice.\n *\n * Every slice URL is a canonical cache key — the search token pins the\n * layer's content epoch (computed from the cached manifest), the\n * canonical query (default-fold literals collapse case/diacritic\n * variants into one entry), and the resume position. Identical searches\n * from any reader of the document hit the same CDN entry; matches are\n * all that ever crosses the trust boundary, and the rects/full endpoint\n * split keeps permission tiers in disjoint cache namespaces.\n *\n * Staleness rides the standard versioned-read signal: a first slice\n * answered `NotFound` means our manifest is stale → refresh and retry\n * once; a continuation answered `NotFound` means the document changed\n * mid-search → `InvalidArg`, same contract as the local engine's cursor.\n */\nexport class CloudDocumentSearchService implements DocumentSearchService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n ) {}\n\n query(request: SearchRequest): AbortablePromise<SearchSlice> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document not open: ${this.docId}`),\n );\n }\n return AbortablePromise.run<SearchSlice>(async (signal) => {\n // Snippets are their own resource (and CDN prefix): they need `doc.text.copy`.\n const path = request.snippets ? wirePaths.layerSearchFull : wirePaths.layerSearchRects;\n const get = (token: string) =>\n this.http.getJson(\n path(this.docId, this.layerName, token),\n (raw) => SearchSliceSchema.parse(raw),\n signal,\n );\n const query = canonicalSearchQuery(request);\n // The search token (the URL, the cache key) pins the scan origin by\n // the page's object number.\n const from = request.from?.objectNumber;\n\n if (request.cursor !== undefined) {\n let token: SearchToken;\n try {\n token = decodeSearchToken(request.cursor);\n } catch {\n throw new EngineError(EngineErrorCode.InvalidArg, 'malformed search cursor');\n }\n // Local-engine cursor parity: a cursor is pinned to its query and\n // scan origin; replaying it against anything else is a caller bug.\n if (queryIdentity(token.query) !== queryIdentity(query)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'search cursor belongs to a different query — restart the search',\n );\n }\n if (from !== undefined && from !== token.from) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n '`from` conflicts with the cursor — omit it when resuming',\n );\n }\n try {\n return await get(request.cursor);\n } catch (err) {\n if (EngineError.is(err, EngineErrorCode.NotFound)) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'document changed since this search cursor was issued — restart the search',\n );\n }\n throw err;\n }\n }\n\n const mint = (epoch: string) =>\n encodeSearchToken({\n epoch,\n query,\n ...(from !== undefined ? { from } : {}),\n skip: 0,\n ...(request.limit !== undefined ? { limit: request.limit } : {}),\n });\n try {\n const manifest = await this.manifest.get(signal);\n return await get(mint(searchContentEpoch(manifest)));\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n // Our cached manifest is behind the layer — the standard\n // versioned-read retry: refresh once, re-mint, re-issue.\n const fresh = await this.manifest.refresh(signal);\n return await get(mint(searchContentEpoch(fresh)));\n }\n });\n }\n}\n\n/** Query identity for cursor validation (option order pinned by hand). */\nfunction queryIdentity(query: SearchQuery): string {\n return JSON.stringify([\n query.regex ? 'r' : 'l',\n query.text,\n query.matchCase ? 1 : 0,\n query.matchDiacritics ? 1 : 0,\n query.wholeWord ? 1 : 0,\n query.ignoreWhitespace ? 1 : 0,\n ]);\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\n\n/**\n * Lightweight, **unverified** JWT payload decoder.\n *\n * We use this on the SDK side purely to extract routing information\n * (the `doc_id` claim) so we know which `/v1/docs/:id/head` URL to\n * hit. Signature verification is the server's job — Layer 2 of the\n * token-class-confusion defense in `JwtVerifier.coerceClaims`\n * rejects anything malformed before the bytes are accepted.\n *\n * This module is intentionally cryptography-free: it never imports\n * `crypto` or `jose`. That keeps the SDK lean for browser bundles\n * (jose adds ~50KB minified) and means a misconfigured customer\n * can't accidentally rely on client-side verification.\n */\n\nexport interface UnverifiedClaims {\n doc_id?: string;\n tenant_id?: string;\n sub?: string;\n exp?: number;\n iat?: number;\n /** Pass-through; we don't validate anything else SDK-side. */\n [key: string]: unknown;\n}\n\nexport function decodeUnverifiedClaims(token: string): UnverifiedClaims {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'malformed jwt: expected 3 segments');\n }\n const payloadB64Url = parts[1]!;\n let bytes: Uint8Array;\n try {\n bytes = base64UrlDecode(payloadB64Url);\n } catch (err) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `malformed jwt payload: ${(err as Error).message ?? err}`,\n );\n }\n let json: string;\n try {\n json = new TextDecoder().decode(bytes);\n } catch (err) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `jwt payload is not valid utf-8: ${(err as Error).message ?? err}`,\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch (err) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `jwt payload is not valid json: ${(err as Error).message ?? err}`,\n );\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'jwt payload must be a json object');\n }\n return parsed as UnverifiedClaims;\n}\n\n/**\n * Decode a base64url string into a `Uint8Array`. Works in both Node\n * and modern browsers; we avoid `Buffer` so the SDK stays\n * browser-friendly. `atob` lives on the global in Node 16+ as well.\n */\nfunction base64UrlDecode(b64url: string): Uint8Array {\n const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/');\n const pad = b64.length % 4;\n const padded = pad === 0 ? b64 : b64 + '='.repeat(4 - pad);\n const bin = atob(padded);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n","import {\n AbortablePromise,\n type AnnotationOwner,\n checkCapability,\n checkCollab,\n checkFieldAction,\n checkSetGroup,\n collabTargetOf,\n decodePdfBits,\n type DocCapability,\n type DocumentAccessInfo,\n type DocumentProtection,\n type DocumentSecurityService,\n type DocumentSecurityState,\n type DocumentUnlockInput,\n type DocumentUnlockResult,\n type EditSessionAccess,\n EngineError,\n EngineErrorCode,\n expandRawScope,\n type FieldRights,\n fieldRightsOf,\n type Identity,\n type PageLayerRights,\n type PasswordPrompt,\n passwordPromptFromState,\n protectedCapabilities,\n securityStateFromHead,\n} from '@embedpdf/engine-core/runtime';\nimport { AccessResponseSchema, wirePaths, type DocumentHead } from '@embedpdf/engine-core/wire';\n\nimport { decodeUnverifiedClaims } from '../transport/decodeUnverifiedClaims';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/** The editing session's side of `/access`: how many numbers to ask for, and what came. */\nexport interface AccessEditing {\n wanted(): number;\n opened(edit: EditSessionAccess): void;\n}\n\nexport class CloudDocumentSecurityService implements DocumentSecurityService {\n private securityState: DocumentSecurityState;\n private access: DocumentAccessInfo | null = null;\n\n /**\n * Parsed JWT identity + scope, decoded once at construction. Used by\n * the local-fallback path for `scope` and `identity` when\n * /access hasn't run yet (public-share with no CDN, password not\n * yet supplied, etc.).\n */\n private readonly tokenScope: ReadonlyArray<string>;\n private readonly tokenIdentity: Identity | null;\n /** Whether the token is a document token with a scope: rights the client can know. */\n private readonly tokenHasDocScope: boolean;\n\n /**\n * What the document's signatures forbid, as the server reports it with\n * each manifest and each `/access`: taken away from every capability\n * check, exactly as the server's route guards take it away.\n */\n private protection: DocumentProtection | null = null;\n\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n initialHead: DocumentHead,\n private readonly view: { isClosed(): boolean },\n initialToken: string | null = null,\n private readonly editing: AccessEditing | null = null,\n ) {\n this.securityState = securityStateFromHead(initialHead);\n const claims = initialToken ? safeDecodeClaims(initialToken) : null;\n this.tokenScope = Array.isArray(claims?.scope) ? (claims!.scope as ReadonlyArray<string>) : [];\n this.tokenIdentity = claims ? identityFromClaims(claims) : null;\n this.tokenHasDocScope = typeof claims?.doc_id === 'string' && Array.isArray(claims?.scope);\n }\n\n /**\n * What the caller may read of a page picture, when the client can know it:\n * once `/access` answered, or from a document token's scope. Null without\n * either (no token, a tenant or API token): the server decides.\n */\n pageLayerRights(): PageLayerRights | null {\n if (!this.access && !this.tokenHasDocScope) return null;\n return {\n annotations: this.allows('doc.annotate.read'),\n formFields: this.allows('doc.forms.read'),\n };\n }\n\n get state(): DocumentSecurityState {\n return this.securityState;\n }\n\n get currentAccess(): DocumentAccessInfo | null {\n return this.access;\n }\n\n /**\n * Expanded capability set. Cloud-canonical post-/access; otherwise\n * computed locally from the JWT scope + /head's pdf bits using the\n * same `expandRawScope` helper engine-local calls — so the value\n * matches across engines bit-for-bit on the same inputs.\n */\n get scope(): ReadonlyArray<string> {\n if (this.access) return this.access.effectiveScope;\n return Array.from(expandRawScope(this.tokenScope, this.pdfBits(), this.protection)).sort();\n }\n\n /**\n * The server route guards' own predicate over the same inputs: what the\n * document's signatures forbid first, then the scope (the server's copy\n * once `/access` answered, else the JWT's), wildcard included, against the\n * PDF bits. `scope` alone can't gate UI: it enumerates concrete grants and\n * drops the `*` admin wildcard.\n */\n allows(cap: DocCapability): boolean {\n return checkCapability(cap, this.rawScope(), this.pdfBits(), this.protection);\n }\n\n /**\n * Cloud-internal: what the document's signatures forbid, from the latest\n * manifest (it changes only when a signature publishes a new version).\n */\n setProtection(protection: DocumentProtection | null): void {\n this.protection = protection;\n }\n\n /**\n * Per-record annotation authorization mirrors — the same\n * `checkCollab`/`checkSetGroup` resolvers the server's route layer\n * enforces with, over the same inputs: the raw scope\n * (server-canonical post-/access, else the JWT's own claim), the\n * caller's identity, and /head's PDF bits. A control gated on these\n * matches the server's allow/deny for the same mutation. False\n * before any token/access context exists — fail closed, same rule\n * as `allows`.\n */\n allowsAnnotation(action: 'create'): boolean;\n allowsAnnotation(action: 'update' | 'delete', annotation: AnnotationOwner): boolean;\n allowsAnnotation(action: 'set-group', target: { groupId: string }): boolean;\n allowsAnnotation(\n action: 'create' | 'update' | 'delete' | 'set-group',\n target?: AnnotationOwner | { groupId: string },\n ): boolean {\n const id = this.identity ?? {};\n // A signature that forbids annotation writes outranks the caller's collab\n // authority, as on the server and in the local engine.\n const annotationsProtected = protectedCapabilities(this.protection).has('doc.annotate.modify');\n switch (action) {\n case 'create':\n if (annotationsProtected) return false;\n return checkCollab('create', selfTarget(id), this.rawScope(), id, this.pdfBits());\n case 'set-group':\n return checkSetGroup(\n 'annotations',\n (target as { groupId: string }).groupId,\n id.groupId,\n this.rawScope(),\n );\n default: {\n const annotation = (target ?? {}) as AnnotationOwner;\n if (annotation.subtype === 'widget') return this.allows('doc.forms.modify');\n if (annotationsProtected) return false;\n const owner = collabTargetOf(annotation);\n return checkCollab(action, owner, this.rawScope(), id, this.pdfBits());\n }\n }\n }\n\n /** Per-field form authorization mirrors: the checks the server's writes run, over the same inputs. */\n allowsField(action: 'fill' | 'sign', field: { groupId: string | null }): boolean;\n allowsField(action: 'set-group', target: { groupId: string }): boolean;\n allowsField(action: 'fill' | 'sign' | 'set-group', target: { groupId: string | null }): boolean {\n if (action === 'set-group') {\n const groupId = target.groupId ?? '';\n return checkSetGroup('fields', groupId, this.identity?.groupId, this.rawScope());\n }\n return checkFieldAction(\n action,\n target.groupId,\n this.rawScope(),\n this.pdfBits(),\n this.protection,\n );\n }\n\n /** The same inputs as `allowsField`, as lists. */\n fieldRights(): FieldRights {\n return fieldRightsOf(this.rawScope(), this.pdfBits(), this.protection, this.identity?.groupId);\n }\n\n /** Raw scope for the collab resolver: server-canonical post-/access, else the JWT claim. */\n private rawScope(): ReadonlyArray<string> {\n return this.access?.scope ?? this.tokenScope;\n }\n\n private pdfBits() {\n return decodePdfBits(this.securityState.permissions.bits);\n }\n\n /**\n * Identity of the current caller, or null when anonymous.\n *\n * Cloud-canonical post-/access; otherwise the identity claims from\n * the JWT itself. Both are the same shape — the post-/access\n * version is just refreshed to reflect any server-side identity\n * augmentation (rare; reserved for future tenant hooks).\n */\n get identity(): Identity | null {\n return this.access?.identity ?? this.tokenIdentity;\n }\n\n /**\n * High-level \"should I prompt for a password?\" — single source of\n * truth, computed via `passwordPromptFromState` so the answer is\n * identical to what the local engine would say for the same\n * security state. See `passwordPromptFromState` for the rules.\n */\n get passwordPrompt(): PasswordPrompt {\n return passwordPromptFromState(this.securityState, this.passwordRejected);\n }\n\n /** Whether the last password tried was wrong (the prompt's `incorrect`). */\n private passwordRejected = false;\n\n unlock(input: DocumentUnlockInput): AbortablePromise<DocumentUnlockResult> {\n if (this.view.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<DocumentUnlockResult>(async (signal) => {\n try {\n const result = await this.postAccess(signal, {\n password: input.password,\n mode: input.mode ?? 'any',\n });\n this.passwordRejected = false;\n return result;\n } catch (error) {\n if (EngineError.is(error, EngineErrorCode.DocPasswordIncorrect)) {\n this.passwordRejected = true;\n }\n throw error;\n }\n });\n }\n\n /**\n * Cloud-internal: call /v1/access with no password to establish\n * a CDN-credentialed session. Used by `CloudEngine.open` when\n * /head's `access.reasons` includes 'cdn' but not 'password' —\n * the server accepts an authenticated /access POST without a\n * password and returns the signed-URL block.\n *\n * Not on the public `DocumentSecurityService` interface — the\n * \"unlock\" verb implies user action, and this path is automatic.\n * Local engine has no equivalent (there's no CDN concept).\n */\n establishAccess(): AbortablePromise<DocumentUnlockResult> {\n if (this.view.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<DocumentUnlockResult>(async (signal) => {\n return await this.postAccess(signal, { mode: 'any' });\n });\n }\n\n /**\n * Single POST /v1/access implementation shared by `unlock()` (with\n * password) and `establishAccess()` (no password). Updates cached\n * security state, caches the access block, and pushes the CDN\n * binding into the HttpClient so subsequent fetches apply CDN\n * tokens via `applyCdnAccess`. It goes as the editing session, and a\n * caller that may create gets the session's object numbers with it\n * (`edit`).\n *\n * `none` CDN adapter → the access block has null overrides/policies\n * and `applyCdnAccess` short-circuits to origin; safe to call always.\n */\n private async postAccess(\n signal: AbortSignal,\n body: { password?: string; mode: 'any' | 'owner' },\n ): Promise<DocumentUnlockResult> {\n const response = await this.http.postJson(\n // Identity rides the path — doc and layer, like every layer route;\n // the affinity tier pins the session bootstrap to the document's\n // pod from the very first request.\n wirePaths.access(this.docId, this.layerName),\n {\n ...(body.password ? { password: body.password } : {}),\n mode: body.mode,\n ...(this.editing ? { objectNumbers: this.editing.wanted() } : {}),\n },\n (raw) => AccessResponseSchema.parse(raw),\n signal,\n { session: true },\n );\n this.securityState = response.security;\n this.protection = response.protection;\n this.access = {\n cdn: response.cdn,\n passwordGrant: response.passwordGrant,\n pdfPermissions: response.pdfPermissions,\n scope: response.scope,\n effectiveScope: response.effectiveScope,\n protection: response.protection,\n identity: response.identity,\n originPasswordPolicy: response.originPasswordPolicy,\n expiresAt: response.expiresAt,\n // Deployment render lattice. Absent on older servers without render policy support.\n ...(response.renderPolicy ? { renderPolicy: response.renderPolicy } : {}),\n bundleLimits: response.bundleLimits,\n ...(response.edit ? { edit: response.edit } : {}),\n };\n if (response.edit) this.editing?.opened(response.edit);\n this.http.setCdnAccess({\n cdn: response.cdn,\n docId: this.docId,\n layerName: this.layerName,\n });\n // DocumentUnlockResult.access is `DocumentAccessInfo | undefined`,\n // not `| null`. We carry the local cache as `| null` (clearer\n // \"not yet unlocked\" semantic); coerce at the boundary.\n return { security: this.securityState, access: this.access ?? undefined };\n }\n}\n\n/**\n * Decode the JWT's payload without verifying. The SDK never verifies\n * tokens client-side — the server is the verifier of record — but it\n * needs the `scope` and identity claims for the local-fallback path\n * of `effectiveScope` / `identity`. Returns null if the token is\n * malformed; the security service treats that as \"no claims known\".\n */\nfunction safeDecodeClaims(token: string): Record<string, unknown> | null {\n try {\n return decodeUnverifiedClaims(token);\n } catch {\n return null;\n }\n}\n\n/**\n * Create's CollabTarget is the caller's own identity — the same\n * derivation as engine-local's `ScopeGuard.targetForSelfCreate`, so\n * `:self` trivially passes and `:group=X` matches the caller's\n * default group.\n */\nfunction selfTarget(id: Identity): { userId?: string; groupId?: string } {\n return {\n ...(id.userId !== undefined ? { userId: id.userId } : {}),\n ...(id.groupId !== undefined ? { groupId: id.groupId } : {}),\n };\n}\n\nconst IDENTITY_STRING_FIELDS = [\n 'userId',\n 'displayName',\n 'email',\n 'title',\n 'organization',\n 'organizationalUnit',\n 'groupId',\n] as const;\n\n/**\n * The token's `identity` claim, read the way the server reads it: string\n * fields, empty values absent. The server rejects a\n * malformed claim; unverified here, anything else is skipped.\n */\nfunction identityFromClaims(claims: Record<string, unknown>): Identity | null {\n const claim = claims['identity'];\n if (!claim || typeof claim !== 'object' || Array.isArray(claim)) return null;\n const record = claim as Record<string, unknown>;\n const out: { -readonly [K in keyof Identity]: Identity[K] } = {};\n for (const key of IDENTITY_STRING_FIELDS) {\n const value = record[key];\n if (typeof value === 'string' && value.length > 0) out[key] = value;\n }\n return Object.keys(out).length > 0 ? out : null;\n}\n","import {\n opIdOf,\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type AnalyzeInput,\n type ChangeAnalysis,\n type DigestAlgorithm,\n type DocumentSignaturesService,\n type FormFieldRef,\n type SessionEventPublisher,\n type SignatureCancelResult,\n type SignatureCompleteInput,\n type SignatureCompleteResult,\n type SignaturePrepareInput,\n type SignaturePrepared,\n type SignatureSnapshot,\n type WriteOptions,\n} from '@embedpdf/engine-core/runtime';\nimport {\n ChangeAnalysisSchema,\n SignatureCancelResultSchema,\n SignatureCompleteResultSchema,\n SignaturePreparedWireSchema,\n SignatureSnapshotSchema,\n decodePrepared,\n toBase64,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\n\nimport { buildRoleMutationForm } from './buildMutationForm';\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { CloudWrites } from './CloudWrites';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Cloud-side digital signatures. Two kinds of read, two kinds of URL:\n *\n * - The layer view (`list`, and `analyze` of the working copy) is pinned\n * by the manifest's `docVersion`, like every other layer read: a\n * signature is a layer state change, the immutable URL moves with it.\n * - Signed bytes (`contents`, `digest`, `revisionBytes`, and `analyze`\n * of history) belong to a base version and are content-addressed by\n * the manifest's `baseSha`: immutable forever, shared by every layer\n * and every caller.\n *\n * Signing is the server's two-phase protocol over the same wire shapes\n * the local engine uses. `prepare` and `complete` change the manifest in\n * ways no delta carries (a publish moves `baseSha` itself), so both\n * refresh it before returning.\n */\nexport class CloudDocumentSignaturesService implements DocumentSignaturesService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n private readonly writes: CloudWrites,\n ) {}\n\n list(): AbortablePromise<SignatureSnapshot> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<SignatureSnapshot>(async (signal) =>\n this.http.getJsonWithRefresh(\n async (s) => {\n const manifest = await this.manifest.get(s);\n return wirePaths.layerSignatures(this.docId, this.layerName, manifest.docVersion);\n },\n (raw) => SignatureSnapshotSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n ),\n );\n }\n\n getContents(field: FormFieldRef): AbortablePromise<Uint8Array> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<Uint8Array>(async (signal) => {\n const manifest = await this.manifest.get(signal);\n const name = await this.fieldName(field, signal);\n return this.http.getBytes(\n wirePaths.docVersionSignatureContents(this.docId, manifest.baseSha, name),\n signal,\n );\n });\n }\n\n getDigest(field: FormFieldRef, algorithm: DigestAlgorithm): AbortablePromise<Uint8Array> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<Uint8Array>(async (signal) => {\n const manifest = await this.manifest.get(signal);\n const name = await this.fieldName(field, signal);\n return this.http.getBytes(\n wirePaths.docVersionSignatureDigest(this.docId, manifest.baseSha, name, algorithm),\n signal,\n );\n });\n }\n\n downloadRevision(revisionIndex: number): AbortablePromise<Uint8Array> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<Uint8Array>(async (signal) => {\n const manifest = await this.manifest.get(signal);\n return this.http.getBytes(\n wirePaths.docVersionRevision(this.docId, manifest.baseSha, revisionIndex),\n signal,\n );\n });\n }\n\n /**\n * `until: 'working-copy'` judges the layer's pending edits against the\n * base at the layer URL; anything else, the default `'persisted'`\n * included, is history of the base version and resolves at the version\n * URL (the saved file, as the local engine judges by default).\n */\n analyze(input: AnalyzeInput): AbortablePromise<ChangeAnalysis> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<ChangeAnalysis>(async (signal) => {\n const manifest = await this.manifest.get(signal);\n if (input.until === 'working-copy') {\n return this.http.getJsonWithRefresh(\n async (s) => {\n const current = await this.manifest.get(s);\n return wirePaths.layerSignaturesAnalysis(this.docId, this.layerName, {\n docVersion: current.docVersion,\n since: input.since,\n ...(input.exploratoryLevel !== undefined\n ? { exploratoryLevel: input.exploratoryLevel }\n : {}),\n ...(input.detail !== undefined ? { detail: input.detail } : {}),\n });\n },\n (raw) => ChangeAnalysisSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n }\n return this.http.getJson(\n wirePaths.docVersionAnalysis(this.docId, manifest.baseSha, {\n since: input.since,\n ...(typeof input.until === 'object' ? { until: input.until.revisionIndex } : {}),\n ...(input.exploratoryLevel !== undefined\n ? { exploratoryLevel: input.exploratoryLevel }\n : {}),\n ...(input.detail !== undefined ? { detail: input.detail } : {}),\n }),\n (raw) => ChangeAnalysisSchema.parse(raw),\n signal,\n );\n });\n }\n\n prepare(\n input: SignaturePrepareInput,\n options?: WriteOptions,\n ): AbortablePromise<SignaturePrepared> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<SignaturePrepared>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const { appearance, ...rest } = input;\n const form = buildRoleMutationForm(rest, {\n appearance: appearance && {\n bytes: appearance.pdf.slice().buffer as ArrayBuffer,\n mimeType: 'application/pdf',\n name: 'appearance.pdf',\n },\n });\n const prepared = await write.send((sent) =>\n this.http.postMultipartJson(\n wirePaths.layerSignaturesPrepare(this.docId, this.layerName),\n form,\n (raw) => decodePrepared(SignaturePreparedWireSchema.parse(raw)),\n signal,\n sent,\n ),\n );\n // Prepare is a layer write (layerVersion, working, docVersion moved)\n // that returns no mutation envelope: refresh, don't guess.\n await this.manifest.refresh(signal);\n this.publisher.publishWrite(opId, {\n type: 'signatures.prepared',\n field: input.field,\n ...prepared,\n });\n return prepared;\n });\n });\n }\n\n complete(\n input: SignatureCompleteInput,\n options?: WriteOptions,\n ): AbortablePromise<SignatureCompleteResult> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<SignatureCompleteResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n wirePaths.layerSignatureComplete(this.docId, this.layerName, input.signingId),\n { cms: toBase64(input.cms), expectedVersion: input.expectedVersion },\n (raw) => SignatureCompleteResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n // A publish changes the whole manifest in substance (baseSha,\n // baseByteLength, layerVersion, working, every promoted page pin, the\n // plane pointers, the scopes): refresh on `completed` and on a\n // replay alike, then announce the new version.\n await this.manifest.refresh(signal);\n if (result.status === 'completed') {\n this.publisher.publishWrite(\n opId,\n { type: 'signatures.completed', signingId: input.signingId, ...result },\n { type: 'document.versioned', version: result.version },\n );\n }\n return result;\n });\n });\n }\n\n cancel(signingId: string, options?: WriteOptions): AbortablePromise<SignatureCancelResult> {\n const rejected = this.closedRejection();\n if (rejected) return rejected;\n return AbortablePromise.run<SignatureCancelResult>(async (signal) => {\n const opId = opIdOf(options);\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.deleteJson(\n wirePaths.layerSignatureCancel(this.docId, this.layerName, signingId),\n (raw) => SignatureCancelResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n if (result.status === 'cancelled') {\n this.publisher.publishWrite(opId, { type: 'signatures.cancelled', signingId });\n }\n return result;\n });\n });\n }\n\n /** Version routes address a field by its fully qualified name; an object-number ref is resolved through the snapshot. */\n private async fieldName(field: FormFieldRef, signal: AbortSignal): Promise<string> {\n if (field.kind === 'fqn') return field.name;\n const snapshot = await this.http.getJsonWithRefresh(\n async (s) => {\n const manifest = await this.manifest.get(s);\n return wirePaths.layerSignatures(this.docId, this.layerName, manifest.docVersion);\n },\n (raw) => SignatureSnapshotSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n const match = snapshot.signatures.find(\n (s) => s.field.kind === 'objectNumber' && s.field.objectNumber === field.objectNumber,\n );\n if (!match) {\n throw new EngineError(EngineErrorCode.NotFound, `no signature field #${field.objectNumber}`);\n }\n return match.fieldName;\n }\n\n private closedRejection(): AbortablePromise<never> | null {\n if (!this.isClosed()) return null;\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n}\n","import {\n opIdOf,\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type CustomMetadata,\n type CustomMetadataPatch,\n type CustomMetadataService,\n type CustomMetadataUpdateResult,\n type DocumentMetadata,\n type MetadataPatch,\n type MetadataService,\n type MetadataUpdateResult,\n type MutationMeta,\n type SessionEventPublisher,\n type WriteOptions,\n} from '@embedpdf/engine-core/runtime';\nimport {\n CustomMetadataSchema,\n CustomMetadataUpdateResultSchema,\n DocumentMetadataSchema,\n MetadataUpdateResultSchema,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { CloudWrites } from './CloudWrites';\nimport { planesInherited } from './planes';\nimport type { HttpClient } from '../transport/HttpClient';\n\ninterface MetadataDeps {\n http: HttpClient;\n docId: string;\n layerName: string;\n isClosed: () => boolean;\n manifest: ManifestAccessor;\n publisher: SessionEventPublisher;\n writes: CloudWrites;\n}\n\n/** One half of the Info dict: the leaf it reads and the route it writes. */\ninterface MetadataLeaf<T, R> {\n docPath: (docId: string, metadataVersion: number) => string;\n layerPath: (docId: string, layerName: string, metadataVersion: number) => string;\n updatePath: (docId: string, layerName: string) => string;\n parse: (raw: unknown) => T;\n parseResult: (raw: unknown) => R;\n}\n\nconst STANDARD: MetadataLeaf<DocumentMetadata, MetadataUpdateResult> = {\n docPath: wirePaths.docMetadata,\n layerPath: wirePaths.layerMetadata,\n updatePath: wirePaths.layerMetadataUpdate,\n parse: (raw) => DocumentMetadataSchema.parse(raw),\n parseResult: (raw) => MetadataUpdateResultSchema.parse(raw),\n};\n\nconst CUSTOM: MetadataLeaf<CustomMetadata, CustomMetadataUpdateResult> = {\n docPath: wirePaths.docCustomMetadata,\n layerPath: wirePaths.layerCustomMetadata,\n updatePath: wirePaths.layerCustomMetadataUpdate,\n parse: (raw) => CustomMetadataSchema.parse(raw),\n parseResult: (raw) => CustomMetadataUpdateResultSchema.parse(raw),\n};\n\nfunction closedError(docId: string): EngineError {\n return new EngineError(EngineErrorCode.DocNotOpen, `document ${docId} is closed`);\n}\n\n/**\n * The read. The JSON lives at a content-addressed `…@metadataVersion=N` leaf\n * (not in the manifest); the manifest only publishes the `metadataVersion`\n * pointer, which both halves of the dict share. So the read pulls it from\n * the cached manifest, fetches the leaf, and on a 404 (stale pointer)\n * transparently refreshes the manifest and retries once. `metadataVersion`\n * bumps only on metadata writes, so the leaf stays cached across page and\n * annotation edits.\n */\nfunction readLeaf<T>(deps: MetadataDeps, leaf: MetadataLeaf<T, unknown>): AbortablePromise<T> {\n if (deps.isClosed()) return AbortablePromise.rejectReason(closedError(deps.docId));\n return AbortablePromise.run<T>(async (signal) => {\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await deps.manifest.get(s);\n // Plane-scope rule: the leaf depends on the `metadata` plane — while\n // inherited, one doc-level URL serves every visitor.\n return planesInherited(manifest, ['metadata'])\n ? leaf.docPath(deps.docId, manifest.metadataVersion)\n : leaf.layerPath(deps.docId, deps.layerName, manifest.metadataVersion);\n };\n return deps.http.getJsonWithRefresh(\n buildPath,\n leaf.parse,\n async (s) => {\n await deps.manifest.refresh(s);\n },\n signal,\n );\n });\n}\n\n/**\n * The write. It only advances docVersion + metadataVersion (no per-page pin\n * changes, no layoutVersion), so the cached manifest is patched in place —\n * no refetch. `publish` gets the write's `opId`.\n */\nfunction writeLeaf<R extends { meta: MutationMeta }>(\n deps: MetadataDeps,\n leaf: MetadataLeaf<unknown, R>,\n patch: MetadataPatch | CustomMetadataPatch,\n options: WriteOptions | undefined,\n publish: (result: R, opId: string) => void,\n): AbortablePromise<R> {\n if (deps.isClosed()) return AbortablePromise.rejectReason(closedError(deps.docId));\n return AbortablePromise.run<R>(async (signal) => {\n const opId = opIdOf(options);\n return deps.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n deps.http.postJson(\n leaf.updatePath(deps.docId, deps.layerName),\n patch,\n leaf.parseResult,\n signal,\n sent,\n ),\n );\n deps.manifest.apply(result.meta, ['metadata']);\n publish(result, opId);\n return result;\n });\n });\n}\n\nclass CloudCustomMetadataService implements CustomMetadataService {\n constructor(private readonly deps: MetadataDeps) {}\n\n get(): AbortablePromise<CustomMetadata> {\n return readLeaf(this.deps, CUSTOM);\n }\n\n update(\n patch: CustomMetadataPatch,\n options?: WriteOptions,\n ): AbortablePromise<CustomMetadataUpdateResult> {\n return writeLeaf(this.deps, CUSTOM, patch, options, (result, opId) =>\n this.deps.publisher.publishWrite(opId, { type: 'metadata.customUpdated', ...result }),\n );\n }\n}\n\nexport class CloudMetadataService implements MetadataService {\n readonly custom: CustomMetadataService;\n private readonly deps: MetadataDeps;\n\n constructor(\n http: HttpClient,\n docId: string,\n layerName: string,\n isClosed: () => boolean,\n manifest: ManifestAccessor,\n publisher: SessionEventPublisher,\n writes: CloudWrites,\n ) {\n this.deps = { http, docId, layerName, isClosed, manifest, publisher, writes };\n this.custom = new CloudCustomMetadataService(this.deps);\n }\n\n get(): AbortablePromise<DocumentMetadata> {\n return readLeaf(this.deps, STANDARD);\n }\n\n update(patch: MetadataPatch, options?: WriteOptions): AbortablePromise<MetadataUpdateResult> {\n return writeLeaf(this.deps, STANDARD, patch, options, (result, opId) =>\n this.deps.publisher.publishWrite(opId, { type: 'metadata.updated', ...result }),\n );\n }\n}\n","import {\n AbortablePromise,\n objectNumbersIn,\n type EditSessionAccess,\n type EditSessionStatus,\n type ObjectNumberPool,\n type ObjectNumberRange,\n type ObjectNumbersLost,\n} from '@embedpdf/engine-core/runtime';\n\n/** Below this many held numbers, a write asks for a top-up… */\nconst LOW_WATER = 8;\n/** …of up to this many, the most the server tops up by. */\nconst TOP_UP = 32;\n/** The most one bulk reservation asks for. */\nconst MAX_RESERVATION = 1_000;\n/** An editing session's lifetime (ms) until the server states one: the protocol's 15 minutes. */\nconst DEFAULT_LIFETIME_MS = 15 * 60_000;\n\nexport interface CloudObjectNumberPoolOptions {\n /** `POST …/object-numbers`: `count` more numbers for this editing session. */\n reserve(\n count: number,\n signal: AbortSignal,\n ): Promise<{ objectNumbers: ObjectNumberRange[]; expiresIn: number }>;\n now?: () => number;\n}\n\n/** What became of the numbers a write named. */\nexport type WriteOutcome =\n /** It committed: they are spent. */\n | 'committed'\n /** The server refused them (`ObjectNumberUnavailable`): the caller knows. */\n | 'refused'\n /** It failed otherwise: the caller still holds them, for a retry. */\n | 'failed';\n\n/**\n * The cloud engine's object numbers: what the server handed this editing\n * session (the engine's `X-Engine-Session-Id` with the token's subject).\n *\n * Numbers arrive with `/access`, with a write's response (the top-up a\n * write asks for when fewer than 8 are held), with the event stream's\n * `session` events, and from `reserve`'s bulk reservation. A number\n * `take` hands out is the caller's until a write naming it commits.\n *\n * The session lives while the event stream is connected or something\n * keeps it alive; without that it expires, and its numbers may go to\n * another session. So once its expiry has passed while the stream is down,\n * the pool hands out nothing until the server says again what it holds.\n * The stream's `session` event lists everything the session holds: any\n * number this pool held or handed out that isn't on it, and that no write\n * in flight names, is lost (`onLost`, `'reclaimed'`). A new version of the\n * document numbers objects anew: everything is lost (`'versioned'`).\n */\nexport class CloudObjectNumberPool implements ObjectNumberPool {\n private readonly now: () => number;\n /** Held and not handed out, lowest first. */\n private available: number[] = [];\n /** Handed out by `take`, not yet spent by a write. */\n private readonly taken = new Set<number>();\n /** Named by a write in flight, and how many writes name each. */\n private readonly writing = new Map<number, number>();\n /** When the session expires unless kept alive (ms since the epoch). */\n private expiresAt = 0;\n /** Half the longest lifetime the server has told: what a write's touch guarantees. */\n private halfLifetimeMs = DEFAULT_LIFETIME_MS / 2;\n private streamConnected = false;\n private readonly listeners = new Set<(lost: ObjectNumbersLost) => void>();\n /** The bulk reservation in flight, which later `reserve` calls wait behind. */\n private reserving: Promise<void> = Promise.resolve();\n /** The newest version a `versioned` call named. */\n private version: string | null = null;\n\n constructor(private readonly opts: CloudObjectNumberPoolOptions) {\n this.now = opts.now ?? Date.now;\n }\n\n get held(): number {\n return this.usable() ? this.available.length : 0;\n }\n\n take(): number | null {\n if (!this.usable()) return null;\n const objectNumber = this.available.shift();\n if (objectNumber === undefined) return null;\n this.taken.add(objectNumber);\n return objectNumber;\n }\n\n reserve(count: number): AbortablePromise<void> {\n return AbortablePromise.run(async (signal) => {\n const turn = this.reserving.then(async () => {\n while (this.held < count) {\n const wanted = Math.min(count - this.held, MAX_RESERVATION);\n const reserved = await this.opts.reserve(wanted, signal);\n this.receive(reserved.objectNumbers, reserved.expiresIn);\n }\n });\n this.reserving = turn.catch(() => undefined);\n await turn;\n });\n }\n\n onLost(listener: (lost: ObjectNumbersLost) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /** How many numbers a write should ask the server for: 0 while enough are held. */\n topUp(): number {\n const held = this.held;\n return held < LOW_WATER ? TOP_UP - held : 0;\n }\n\n /** How many numbers `/access` should ask for: enough to make up the first block. */\n wantedAtAccess(): number {\n return Math.max(0, LOW_WATER - this.held);\n }\n\n // ── what the server says ────────────────────────────────────────────────\n\n /**\n * `/access` answered for the editing session. A session the server made\n * anew holds nothing of what this pool had.\n */\n opened(edit: EditSessionAccess): void {\n if (edit.session === 'new') this.lose(this.unspent(), 'reclaimed');\n this.receive(edit.objectNumbers, edit.expiresIn);\n }\n\n /**\n * Numbers handed to the session: by `/access`, a write's top-up or the\n * bulk reservation; `expiresIn` (seconds) when the answer told it. Numbers\n * held from before an expiry the server can't vouch for any more are\n * dropped: only a `session` event says which survived.\n */\n receive(ranges: readonly ObjectNumberRange[], expiresIn?: number): void {\n if (expiresIn !== undefined) {\n if (!this.usable()) this.lose(this.available.splice(0), 'reclaimed');\n this.expiresIn(expiresIn);\n }\n this.add(objectNumbersIn(ranges));\n }\n\n /**\n * The event stream's `session` event: everything the session holds now.\n * What this pool held or handed out and the list doesn't name, unless a\n * write in flight names it, is lost.\n */\n sync(status: EditSessionStatus): void {\n this.expiresIn(status.expiresIn);\n const held = new Set(objectNumbersIn(status.held));\n const lost = this.unspent().filter((n) => !held.has(n));\n for (const n of lost) this.taken.delete(n);\n this.available = [...held]\n .filter((n) => !this.taken.has(n) && !this.writing.has(n))\n .sort((a, b) => a - b);\n this.emit(lost, 'reclaimed');\n }\n\n /**\n * Version `sha256` was published: it numbers objects anew, so every number\n * held or handed out is gone. Told once per version (the stream and this\n * engine's own completion both tell it, in either order).\n */\n versioned(sha256: string): void {\n if (sha256 === this.version) return;\n this.version = sha256;\n this.lose(this.unspent(), 'versioned');\n }\n\n /** The event stream connected or dropped: while it's up, the server keeps the session alive. */\n connected(connected: boolean): void {\n this.streamConnected = connected;\n }\n\n // ── writes ──────────────────────────────────────────────────────────────\n\n /** A write that names `numbers` was called. */\n beginWrite(numbers: readonly number[]): void {\n for (const n of numbers) this.writing.set(n, (this.writing.get(n) ?? 0) + 1);\n }\n\n /**\n * The write that named `numbers` settled. A committed write also kept the\n * session alive: at least half its lifetime is left.\n */\n endWrite(numbers: readonly number[], outcome: WriteOutcome): void {\n for (const n of numbers) {\n const left = (this.writing.get(n) ?? 1) - 1;\n if (left > 0) this.writing.set(n, left);\n else this.writing.delete(n);\n if (outcome !== 'failed') this.taken.delete(n);\n }\n if (outcome === 'committed') {\n this.expiresAt = Math.max(this.expiresAt, this.now() + this.halfLifetimeMs);\n }\n }\n\n // ── inside ──────────────────────────────────────────────────────────────\n\n private usable(): boolean {\n return this.streamConnected || this.now() < this.expiresAt;\n }\n\n private expiresIn(seconds: number): void {\n const ms = seconds * 1000;\n this.expiresAt = this.now() + ms;\n this.halfLifetimeMs = Math.max(this.halfLifetimeMs, ms / 2);\n }\n\n private add(numbers: readonly number[]): void {\n const known = new Set([...this.available, ...this.taken]);\n const fresh = numbers.filter((n) => !known.has(n) && !this.writing.has(n));\n if (fresh.length === 0) return;\n this.available = [...this.available, ...fresh].sort((a, b) => a - b);\n }\n\n /** Held or handed out, and named by no write in flight. */\n private unspent(): number[] {\n return [...this.available, ...this.taken].filter((n) => !this.writing.has(n));\n }\n\n private lose(numbers: readonly number[], reason: ObjectNumbersLost['reason']): void {\n const gone = new Set(numbers);\n this.available = this.available.filter((n) => !gone.has(n));\n for (const n of gone) this.taken.delete(n);\n this.emit([...gone], reason);\n }\n\n private emit(numbers: readonly number[], reason: ObjectNumbersLost['reason']): void {\n if (numbers.length === 0) return;\n const lost: ObjectNumbersLost = { numbers: [...numbers].sort((a, b) => a - b), reason };\n for (const listener of [...this.listeners]) listener(lost);\n }\n}\n","import {\n createPageImageHandle,\n EngineError,\n EngineErrorCode,\n type AnnotationAppearanceImage,\n type AnnotationAppearanceImagesResult,\n type PageImageResult,\n} from '@embedpdf/engine-core/runtime';\nimport { AnnotationAppearanceBatchSchema } from '@embedpdf/engine-core/wire';\n\n/**\n * Parse the appearance `multipart/form-data` response into the same\n * `AnnotationAppearanceImagesResult` shape the local engine produces. The\n * `body` part is validated against the wire schema; each image (the part\n * `resource:<key>` its entry names) is wrapped in a `PageImageHandle`\n * backed by the in-memory blob we already downloaded.\n */\nexport async function parseAppearanceForm(\n form: FormData,\n): Promise<AnnotationAppearanceImagesResult> {\n const raw = form.get('body');\n if (typeof raw !== 'string') {\n throw new EngineError(EngineErrorCode.WireFormat, 'appearance response missing its body part');\n }\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(raw);\n } catch (err) {\n throw new EngineError(\n EngineErrorCode.WireFormat,\n `appearance body is not valid JSON: ${(err as Error)?.message ?? err}`,\n );\n }\n const body = AnnotationAppearanceBatchSchema.parse(parsedJson);\n\n const appearances: AnnotationAppearanceImage[] = await Promise.all(\n body.appearances.map(async (entry) => {\n const name = `resource:${entry.resources.image}`;\n const partValue = form.get(name);\n if (partValue === null || typeof partValue === 'string') {\n throw new EngineError(\n EngineErrorCode.WireFormat,\n `appearance response missing image part \"${name}\"`,\n );\n }\n const blob = partValue as Blob;\n const bytes = new Uint8Array(await blob.arrayBuffer());\n const result: PageImageResult = {\n width: entry.width,\n height: entry.height,\n format: entry.format,\n contentType: entry.contentType,\n source: { kind: 'bytes', bytes },\n };\n const image = createPageImageHandle(result, {\n async blob() {\n return blob;\n },\n });\n return {\n ref: entry.ref,\n mode: entry.mode,\n state: entry.state,\n rect: entry.rect,\n image,\n };\n }),\n );\n\n return { page: body.page, appearances };\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n deletedAnnotationsOf,\n encodeAnnotKey,\n hasAnnotationResources,\n opIdOf,\n resolveAnnotationResources,\n withFileFromResource,\n type AnnotationResourceRole,\n type AnnotationCreateOptions,\n type AnnotationUpdateOptions,\n type SessionEventPublisher,\n type WireAnnotationResources,\n type AnnotationAppearanceImageOptions,\n type AnnotationAppearanceImagesResult,\n type AnnotationDraft,\n type AnnotationList,\n type AnnotationPatch,\n type AnnotationRef,\n type AnnotationCreateResult,\n type AnnotationDeleteResult,\n type AnnotationFlattenResult,\n type AnnotationPosition,\n type AnnotationReorderResult,\n type FlattenWriteOptions,\n type AnnotationUpdateResult,\n type DocumentEventInit,\n type MutationMeta,\n type PageAnnotationsService,\n type PageNetworkRenderFormat,\n type PageRef,\n type WriteOptions,\n checkImageQuality,\n} from '@embedpdf/engine-core/runtime';\nimport {\n AnnotationCreateResultSchema,\n AnnotationDeleteResultSchema,\n AnnotationListSchema,\n AnnotationFlattenResultSchema,\n AnnotationReorderResultSchema,\n AnnotationUpdateResultSchema,\n annotationAppearancesImageOptionsToWire,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\n\nimport { parseAppearanceForm } from './appearanceForm';\nimport { buildAnnotationMutationForm } from './buildMutationForm';\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { CloudWrite, CloudWrites } from './CloudWrites';\nimport { planesInherited } from './planes';\nimport { withObjectNumbers } from '../shared/withObjectNumbers';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Cloud-side page annotation service. Mirrors the local wiring: each\n * call produces an `AbortablePromise` that propagates `signal.abort()`\n * down to `fetch` and validates the JSON response with the wire-stable\n * Zod schema.\n *\n * Reads use immutable versioned layer URLs discovered from the\n * manifest. Mutations use unversioned layer URLs and are never cached.\n */\nexport class CloudPageAnnotationsService implements PageAnnotationsService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly pageRef: PageRef,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n private readonly writes: CloudWrites,\n ) {}\n\n list(): AbortablePromise<AnnotationList> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AnnotationList>(async (signal) => {\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n const pageObjectNumber = this.pageRef.objectNumber;\n const page = manifest.pages.find((p) => p.page.objectNumber === pageObjectNumber);\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${pageObjectNumber} in document ${this.docId}`,\n );\n }\n // Plane-scope rule: the list depends on the `annotations` plane. A\n // base's own annotations are simply visible through an inheriting\n // layer, so every visitor reads one doc-level URL served from the\n // base session.\n return planesInherited(manifest, ['annotations'])\n ? wirePaths.docPageAnnotations(this.docId, this.pageRef, page.cache.annotationVersion)\n : wirePaths.layerPageAnnotations(\n this.docId,\n this.layerName,\n this.pageRef,\n page.cache.annotationVersion,\n );\n };\n return this.http.getJsonWithRefresh(\n buildPath,\n (raw) => AnnotationListSchema.parse(raw),\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n });\n }\n\n renderAppearances(\n options: AnnotationAppearanceImageOptions = {},\n ): AbortablePromise<AnnotationAppearanceImagesResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AnnotationAppearanceImagesResult>(async (signal) => {\n checkImageQuality(options.quality);\n // The cloud appearance endpoint is always content-addressed, so the URL\n // must carry an explicit network format (PNG/WebP). Default to WebP when\n // the caller omits it, matching render.image().\n const format: PageNetworkRenderFormat = options.format ?? 'webp';\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n const pageObjectNumber = this.pageRef.objectNumber;\n const page = manifest.pages.find((p) => p.page.objectNumber === pageObjectNumber);\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${pageObjectNumber} in document ${this.docId}`,\n );\n }\n const wireToken = annotationAppearancesImageOptionsToWire(\n { ...options, format },\n { annotationVersion: page.cache.annotationVersion },\n );\n // Same `annotations` plane switch as list(): the appearance\n // batch shares too.\n return planesInherited(manifest, ['annotations'])\n ? wirePaths.docPageAnnotationAppearances(this.docId, this.pageRef, wireToken)\n : wirePaths.layerPageAnnotationAppearances(\n this.docId,\n this.layerName,\n this.pageRef,\n wireToken,\n );\n };\n const form = await this.http.getFormDataWithRefresh(\n buildPath,\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n return parseAppearanceForm(form);\n });\n }\n\n /**\n * One of the annotation's resources. `file` is a read over the immutable\n * `attachment-files` leaf, pinned by the manifest's `attachmentsVersion`\n * (annotation-level files re-key on the same pin as document-level ones),\n * with the same stale-404 refresh retry as {@link list}. `appearance` is a\n * derived read (no-store), like {@link exportAppearance}. Both address the\n * annotation by the same `:annotKey` update()/delete() use.\n */\n downloadResource(ref: AnnotationRef, role: AnnotationResourceRole): AbortablePromise<Uint8Array> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n if (ref.page.objectNumber !== this.pageRef.objectNumber) {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `ref.page ${ref.page.objectNumber} != page ${this.pageRef.objectNumber}`,\n ),\n );\n }\n const annotKey = encodeAnnotKey(ref);\n if (role === 'appearance') {\n return AbortablePromise.run<Uint8Array>(async (signal) =>\n this.http.getBytes(\n wirePaths.layerAnnotationAppearanceResource(\n this.docId,\n this.layerName,\n this.pageRef,\n annotKey,\n ),\n signal,\n ),\n );\n }\n return AbortablePromise.run<Uint8Array>(async (signal) => {\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n // A FileAttachment annotation's bytes depend on both planes —\n // the annotation must exist in this view (`annotations`) and the\n // byte pin is `attachmentsVersion` (`attachments`).\n return planesInherited(manifest, ['annotations', 'attachments'])\n ? wirePaths.docAnnotationFile(\n this.docId,\n this.pageRef,\n annotKey,\n manifest.attachmentsVersion,\n )\n : wirePaths.layerAnnotationFile(\n this.docId,\n this.layerName,\n this.pageRef,\n annotKey,\n manifest.attachmentsVersion,\n );\n };\n const file = await this.http.getFileWithRefresh(\n buildPath,\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n return file.bytes;\n });\n }\n\n create(\n draft: AnnotationDraft,\n options: AnnotationCreateOptions = {},\n ): AbortablePromise<AnnotationCreateResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n let opId: string;\n try {\n opId = opIdOf(options);\n } catch (err) {\n return AbortablePromise.rejectReason(err);\n }\n const { resources, objectNumber } = options;\n // A `File` brings its name and type; the bytes travel without them.\n const data = withFileFromResource(draft, resources);\n const path = withObjectNumbers(\n wirePaths.layerPageAnnotationsCreate(this.docId, this.layerName, this.pageRef),\n { objectNumber },\n );\n return AbortablePromise.run<AnnotationCreateResult>((signal) =>\n this.writes.run(\n opId,\n signal,\n async (write) => {\n // Without resources the request is the plain JSON POST of the data;\n // with them it is multipart (see `buildAnnotationMutationForm`).\n const wireResources = await resolveAnnotationResources(resources);\n const parse = (raw: unknown) => AnnotationCreateResultSchema.parse(raw);\n const result = await write.send((sent) =>\n hasAnnotationResources(wireResources)\n ? this.http.postMultipartJson(\n path,\n buildAnnotationMutationForm(data, wireResources),\n parse,\n signal,\n sent,\n )\n : this.http.postJson(path, data, parse, signal, sent),\n );\n return this.absorbMutation(opId, result, 'annotations.created');\n },\n [objectNumber],\n ),\n );\n }\n\n update(\n ref: AnnotationRef,\n patch: AnnotationPatch,\n options: AnnotationUpdateOptions = {},\n ): AbortablePromise<AnnotationUpdateResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n let opId: string;\n try {\n opId = opIdOf(options);\n } catch (err) {\n return AbortablePromise.rejectReason(err);\n }\n const { resources } = options;\n if (ref.page.objectNumber !== this.pageRef.objectNumber) {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `ref.page ${ref.page.objectNumber} != page ${this.pageRef.objectNumber}`,\n ),\n );\n }\n const path = wirePaths.layerAnnotationByKey(\n this.docId,\n this.layerName,\n this.pageRef,\n encodeAnnotKey(ref),\n );\n return AbortablePromise.run<AnnotationUpdateResult>((signal) =>\n this.writes.run(opId, signal, async (write) => {\n const wireResources = await resolveAnnotationResources(resources);\n const result = await this.patchMutation(write, path, { patch }, wireResources, signal);\n return this.absorbMutation(opId, result, 'annotations.updated');\n }),\n );\n }\n\n /** PATCH as plain JSON, or as multipart when resources came with the patch. */\n private patchMutation(\n write: CloudWrite,\n path: string,\n body: object,\n resources: WireAnnotationResources,\n signal: AbortSignal,\n ): Promise<AnnotationUpdateResult> {\n const parse = (raw: unknown) => AnnotationUpdateResultSchema.parse(raw);\n return write.send((sent) =>\n hasAnnotationResources(resources)\n ? this.http.patchMultipartJson(\n path,\n buildAnnotationMutationForm(body, resources),\n parse,\n signal,\n sent,\n )\n : this.http.patchJson(path, body, parse, signal, sent),\n );\n }\n\n delete(ref: AnnotationRef, options?: WriteOptions): AbortablePromise<AnnotationDeleteResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n let opId: string;\n try {\n opId = opIdOf(options);\n } catch (err) {\n return AbortablePromise.rejectReason(err);\n }\n if (ref.page.objectNumber !== this.pageRef.objectNumber) {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `ref.page ${ref.page.objectNumber} != page ${this.pageRef.objectNumber}`,\n ),\n );\n }\n const path = wirePaths.layerAnnotationByKey(\n this.docId,\n this.layerName,\n this.pageRef,\n encodeAnnotKey(ref),\n );\n return AbortablePromise.run<AnnotationDeleteResult>((signal) =>\n this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.deleteJson(\n path,\n (raw) => AnnotationDeleteResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n return this.absorbDelete(opId, result);\n }),\n );\n }\n\n reorder(\n refs: AnnotationRef[],\n position: AnnotationPosition,\n options?: WriteOptions,\n ): AbortablePromise<AnnotationReorderResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n let opId: string;\n try {\n opId = opIdOf(options);\n } catch (err) {\n return AbortablePromise.rejectReason(err);\n }\n // The page is part of the URL; the worker validates per-ref consistency\n // again, but rejecting up front gives a cleaner error from the client side.\n for (const r of refs) {\n if (r.page.objectNumber !== this.pageRef.objectNumber) {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `reorder ref points at page ${r.page.objectNumber}; service is bound to page ${this.pageRef.objectNumber}`,\n ),\n );\n }\n }\n const path = wirePaths.layerPageAnnotationsReorder(this.docId, this.layerName, this.pageRef);\n return AbortablePromise.run<AnnotationReorderResult>((signal) =>\n this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n path,\n { refs, position },\n (raw) => AnnotationReorderResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n // A reorder moves only the annotations: widgets have their own order.\n this.manifest.apply(result.meta, ['annotations']);\n this.publisher.publishWrite(opId, {\n type: 'annotations.reordered',\n page: this.pageRef,\n ...result,\n });\n return result;\n }),\n );\n }\n\n flatten(\n refs: AnnotationRef[],\n options?: FlattenWriteOptions,\n ): AbortablePromise<AnnotationFlattenResult> {\n const usage = options?.usage ?? 'display';\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n let opId: string;\n try {\n opId = opIdOf(options);\n } catch (err) {\n return AbortablePromise.rejectReason(err);\n }\n for (const r of refs) {\n if (r.page.objectNumber !== this.pageRef.objectNumber) {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `flatten ref points at page ${r.page.objectNumber}; service is bound to page ${this.pageRef.objectNumber}`,\n ),\n );\n }\n }\n const path = wirePaths.layerPageAnnotationsFlatten(this.docId, this.layerName, this.pageRef);\n return AbortablePromise.run<AnnotationFlattenResult>((signal) =>\n this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.postJson(\n path,\n { refs, usage },\n (raw) => AnnotationFlattenResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n // Nothing applied comes back without a cache delta: no artifact, no\n // coherence bump, no event.\n if (result.meta.cacheDelta === null) return result;\n // Flatten bakes annotations and form fields into page content.\n this.manifest.apply(result.meta, ['content', 'annotations', 'forms']);\n this.publisher.publishWrite(opId, { type: 'annotations.flattened', ...result });\n return result;\n }),\n );\n }\n\n exportAppearance(refs: AnnotationRef[]): AbortablePromise<Uint8Array> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n for (const r of refs) {\n if (r.page.objectNumber !== this.pageRef.objectNumber) {\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `exportAppearance ref points at page ${r.page.objectNumber}; service is bound to page ${this.pageRef.objectNumber}`,\n ),\n );\n }\n }\n // A read (gated by doc.download server-side): no absorb, no event.\n return AbortablePromise.run<Uint8Array>(async (signal) =>\n this.http.postJsonBytes(\n wirePaths.layerPageAnnotationsAppearance(this.docId, this.layerName, this.pageRef),\n { refs },\n signal,\n ),\n );\n }\n\n /**\n * Patch the cached manifest, then publish the mutation to the document's\n * event stream (in that order — listeners reading the manifest in their\n * callback must see post-mutation state). Each call site pairs the event\n * `type` with the matching result by construction; the cast localizes that\n * pairing here instead of widening every site.\n */\n /** A delete's event names what went, for listeners that didn't delete it. */\n private absorbDelete(opId: string, result: AnnotationDeleteResult): AnnotationDeleteResult {\n this.manifest.apply(result.meta, ['annotations']);\n this.publisher.publishWrite(opId, {\n type: 'annotations.deleted',\n page: this.pageRef,\n deleted: deletedAnnotationsOf(result),\n ...result,\n });\n return result;\n }\n\n private absorbMutation<T extends { meta: MutationMeta }>(\n opId: string,\n result: T,\n type: 'annotations.created' | 'annotations.updated',\n ): T {\n this.manifest.apply(result.meta, ['annotations']);\n this.publisher.publishWrite(opId, {\n type,\n page: this.pageRef,\n ...result,\n } as unknown as DocumentEventInit);\n return result;\n }\n}\n","import {\n AbortablePromise,\n checkImageQuality,\n EngineError,\n EngineErrorCode,\n type AnnotationAppearanceImageOptions,\n type AnnotationAppearanceImagesResult,\n type PageFormsService,\n type PageNetworkRenderFormat,\n type PageRef,\n} from '@embedpdf/engine-core/runtime';\nimport { wirePaths, widgetAppearancesImageOptionsToWire } from '@embedpdf/engine-core/wire';\n\nimport { parseAppearanceForm } from './appearanceForm';\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { planesInherited } from './planes';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Cloud page form service: the page's widget images, one read of the\n * immutable `form/pages/{p}/appearances@` leaf at the page's `widgetVersion`,\n * at the base's URL while the layer inherits the `forms` plane.\n */\nexport class CloudPageFormsService implements PageFormsService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly pageRef: PageRef,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n ) {}\n\n renderAppearances(\n options: AnnotationAppearanceImageOptions = {},\n ): AbortablePromise<AnnotationAppearanceImagesResult> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<AnnotationAppearanceImagesResult>(async (signal) => {\n checkImageQuality(options.quality);\n // A content-addressed URL carries an explicit network format.\n const format: PageNetworkRenderFormat = options.format ?? 'webp';\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n const pageObjectNumber = this.pageRef.objectNumber;\n const page = manifest.pages.find((p) => p.page.objectNumber === pageObjectNumber);\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${pageObjectNumber} in document ${this.docId}`,\n );\n }\n const token = widgetAppearancesImageOptionsToWire(\n { ...options, format },\n { widgetVersion: page.cache.widgetVersion },\n );\n return planesInherited(manifest, ['forms'])\n ? wirePaths.docPageFormAppearances(this.docId, this.pageRef, token)\n : wirePaths.layerPageFormAppearances(this.docId, this.layerName, this.pageRef, token);\n };\n const form = await this.http.getFormDataWithRefresh(\n buildPath,\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n );\n return parseAppearanceForm(form);\n });\n }\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n createPageImageHandle,\n type PageImageHandle,\n type PageImageOptions,\n type PageImageResult,\n type PageLayerRights,\n type PageLayout,\n type PageNetworkRenderFormat,\n type PageRef,\n type PageRenderImage,\n type PageRenderService,\n type PageRenderTransform,\n renderAreaTransform,\n renderTargetArea,\n checkImageQuality,\n resolvePageLayers,\n} from '@embedpdf/engine-core/runtime';\nimport {\n PAGE_RENDER_FAMILIES,\n pageRenderFamilyOf,\n renderImageOptionsToWire,\n wirePaths,\n type RenderVersions,\n} from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { planesInherited } from './planes';\nimport type { HttpClient } from '../transport/HttpClient';\n\nexport class CloudPageRenderService implements PageRenderService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly pageRef: PageRef,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly layout: (signal: AbortSignal) => Promise<PageLayout>,\n /** What the caller may read, when the client can know it; null leaves it to the server. */\n private readonly layerRights: () => PageLayerRights | null,\n ) {}\n\n image(options: PageImageOptions = {}): AbortablePromise<PageRenderImage> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<PageRenderImage>(async (signal) => {\n checkImageQuality(options.quality);\n const format = normalizeFormat(options.format);\n // A picture draws what the caller may read, and the family it draws is\n // its path. Without the caller's rights (a tenant or API token), it asks\n // for everything and the server decides.\n const layers = resolvePageLayers(\n options,\n this.layerRights() ?? { annotations: true, formFields: true },\n );\n const family = PAGE_RENDER_FAMILIES[pageRenderFamilyOf(layers)];\n const buildPath = async (s: AbortSignal): Promise<string> => {\n const manifest = await this.manifest.get(s);\n const pageObjectNumber = this.pageRef.objectNumber;\n const page = manifest.pages.find((p) => p.page.objectNumber === pageObjectNumber);\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${pageObjectNumber} in document ${this.docId}`,\n );\n }\n // `format` flows through `options` and ends up in the token like\n // every other render option — the wire format treats it uniformly.\n // Normalized above so the URL always carries an explicit,\n // network-supported format (PNG or WebP; default WebP). What the\n // picture draws is its family's path; the token carries the family's\n // pins.\n const pins: RenderVersions = { contentVersion: page.cache.contentVersion };\n for (const pin of family.pins) pins[pin] = page.cache[pin];\n const wireToken = renderImageOptionsToWire({ ...options, format }, pins);\n // Plane-scope rule: a picture resolves at the doc-level (shared base)\n // path iff every plane its family depends on is inherited, so 1,000\n // inheriting visitors share one URL set, one origin render, and no\n // layer session.\n return planesInherited(manifest, family.planes)\n ? wirePaths.docPageRender(this.docId, family.family, this.pageRef, wireToken)\n : wirePaths.layerPageRender(\n this.docId,\n this.layerName,\n family.family,\n this.pageRef,\n wireToken,\n );\n };\n // The advertised URL reflects the current manifest; the blob loader\n // re-resolves per fetch through the 404 → manifest-refresh rail, so a\n // scope flip (e.g. this layer's first annotation write) self-heals\n // instead of failing on a stale path family.\n const [requestPath, transform] = await Promise.all([\n buildPath(signal),\n this.transformOf(options, signal),\n ]);\n const handle = createCloudPageImageHandle(\n {\n width: transform.width,\n height: transform.height,\n format,\n contentType: `image/${format}`,\n source: { kind: 'url', url: this.http.absoluteUrl(requestPath) },\n },\n this.http,\n buildPath,\n async (s) => {\n await this.manifest.refresh(s);\n },\n );\n return { ...handle, transform };\n });\n }\n\n /**\n * The image's transform, computed like the server's render (the same\n * `renderSize` and matrix), so the handle knows its size and its pixels\n * before any are fetched. Only a full page needs the page's layout.\n */\n private async transformOf(\n options: PageImageOptions,\n signal: AbortSignal,\n ): Promise<PageRenderTransform> {\n const target = options.target;\n const area =\n target?.kind === 'rect'\n ? renderTargetArea(target.rect)\n : { x: 0, y: 0, ...(await this.layout(signal)).size };\n return renderAreaTransform(area, options);\n }\n}\n\nfunction createCloudPageImageHandle(\n result: PageImageResult,\n http: HttpClient,\n buildPath: (signal: AbortSignal) => Promise<string>,\n onStaleVersion: (signal: AbortSignal) => Promise<void>,\n): PageImageHandle {\n return createPageImageHandle(result, {\n blob: (signal) =>\n http.getBlobWithRefresh(buildPath, onStaleVersion, signal ?? new AbortController().signal),\n });\n}\n\nfunction normalizeFormat(format: PageImageOptions['format']): PageNetworkRenderFormat {\n if (format === undefined) return 'webp';\n if (format === 'png' || format === 'webp') return format;\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n `cloud render.image() supports only \"png\" and \"webp\" (got \"${format}\")`,\n );\n}\n","import {\n AbortablePromise,\n createTextLayout,\n EngineError,\n EngineErrorCode,\n sliceText,\n type DocumentManifest,\n type PageRef,\n type PageTextService,\n type PageTextSnapshot,\n type TextLayout,\n type TextRange,\n} from '@embedpdf/engine-core/runtime';\nimport {\n PageGeometrySnapshotSchema,\n PageTextSnapshotSchema,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { planesInherited } from './planes';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Cloud-side per-page text service. `get()` fetches the content-addressed\n * URL `/v1/docs/:id/text/pages/:pon/data@contentVersion=N` and `layout()`\n * its geometry twin, where `N` is the page's current `contentVersion` from\n * the cached manifest. On a 404 (stale version) the SDK transparently\n * refreshes `/head` + `/manifest@docVersion=N`, rebuilds the URL with the\n * fresh version, and retries exactly once.\n */\nexport class CloudPageTextService implements PageTextService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly pageRef: PageRef,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n ) {}\n\n get(): AbortablePromise<PageTextSnapshot> {\n return this.readLeaf('text', (raw) => PageTextSnapshotSchema.parse(raw));\n }\n\n slice(range: TextRange): AbortablePromise<string> {\n return AbortablePromise.run(async (signal) =>\n sliceText(await this.get().abortWith(signal), range),\n );\n }\n\n layout(): AbortablePromise<TextLayout> {\n return this.readLeaf('geometry', (raw) =>\n createTextLayout(PageGeometrySnapshotSchema.parse(raw)),\n );\n }\n\n /** One of the page's content leaves at the manifest's pin, with the stale-pin retry. */\n private readLeaf<T>(leaf: 'text' | 'geometry', parse: (raw: unknown) => T): AbortablePromise<T> {\n if (this.isClosed()) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.docId} is closed`),\n );\n }\n return AbortablePromise.run<T>((signal) =>\n this.http.getJsonWithRefresh(\n async (s) => this.leafPath(leaf, await this.manifest.get(s)),\n parse,\n async (s) => {\n await this.manifest.refresh(s);\n },\n signal,\n ),\n );\n }\n\n private leafPath(leaf: 'text' | 'geometry', manifest: DocumentManifest): string {\n const pageObjectNumber = this.pageRef.objectNumber;\n const page = manifest.pages.find((p) => p.page.objectNumber === pageObjectNumber);\n if (!page) {\n throw new EngineError(\n EngineErrorCode.NotFound,\n `no page with object number ${pageObjectNumber} in document ${this.docId}`,\n );\n }\n const version = page.cache.contentVersion;\n // Plane-scope rule: text and geometry depend on the `content` plane —\n // while it is inherited, every visitor's layer reads one doc-level URL\n // (and the base worker session at the origin).\n if (planesInherited(manifest, ['content'])) {\n return leaf === 'text'\n ? wirePaths.docPageText(this.docId, this.pageRef, version)\n : wirePaths.docPageGeometry(this.docId, this.pageRef, version);\n }\n return leaf === 'text'\n ? wirePaths.layerPageText(this.docId, this.layerName, this.pageRef, version)\n : wirePaths.layerPageGeometry(this.docId, this.layerName, this.pageRef, version);\n }\n}\n","import {\n opIdOf,\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n type PageMeasureService,\n type PageRef,\n type PdfMeasure,\n type PageMeasurementViewportList,\n type PageScaleResult,\n type SessionEventPublisher,\n type WriteOptions,\n} from '@embedpdf/engine-core/runtime';\nimport {\n PageMeasurementViewportListSchema,\n PageScaleResultSchema,\n wirePaths,\n} from '@embedpdf/engine-core/wire';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport type { CloudWrites } from './CloudWrites';\nimport type { HttpClient } from '../transport/HttpClient';\n\nexport class CloudPageMeasureService implements PageMeasureService {\n constructor(\n private readonly http: HttpClient,\n private readonly docId: string,\n private readonly layerName: string,\n private readonly pageRef: PageRef,\n private readonly isClosed: () => boolean,\n private readonly manifest: ManifestAccessor,\n private readonly publisher: SessionEventPublisher,\n private readonly writes: CloudWrites,\n ) {}\n listViewports(): AbortablePromise<PageMeasurementViewportList> {\n return AbortablePromise.run(async (signal) => {\n this.check();\n // Viewports have no independent cache pin. Always read the current layer.\n return this.http.getJson(\n wirePaths.layerPageViewports(this.docId, this.layerName, this.pageRef),\n (raw) => PageMeasurementViewportListSchema.parse(raw),\n signal,\n );\n });\n }\n setScale(measure: PdfMeasure | null, options?: WriteOptions): AbortablePromise<PageScaleResult> {\n return AbortablePromise.run(async (signal) => {\n const opId = opIdOf(options);\n this.check();\n return this.writes.run(opId, signal, async (write) => {\n const result = await write.send((sent) =>\n this.http.putJson(\n wirePaths.layerPageScale(this.docId, this.layerName, this.pageRef),\n { measure },\n (raw) => PageScaleResultSchema.parse(raw),\n signal,\n sent,\n ),\n );\n this.manifest.apply(result.meta, []);\n this.publisher.publishWrite(opId, { type: 'pages.scaleSet', ...result });\n return result;\n });\n });\n }\n private check(): void {\n if (this.isClosed())\n throw new EngineError(EngineErrorCode.DocNotOpen, `Document not open: ${this.docId}`);\n }\n}\n","import type {\n PageHandle,\n PageLayerRights,\n PageLayout,\n PageRef,\n SessionEventPublisher,\n} from '@embedpdf/engine-core/runtime';\n\nimport type { ManifestAccessor } from './CloudDocumentHandle';\nimport { CloudPageAnnotationsService } from './CloudPageAnnotationsService';\nimport { CloudPageFormsService } from './CloudPageFormsService';\nimport { CloudPageRenderService } from './CloudPageRenderService';\nimport { CloudPageTextService } from './CloudPageTextService';\nimport { CloudPageMeasureService } from './CloudPageMeasureService';\nimport type { CloudWrites } from './CloudWrites';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Cloud page handle, keyed on `ref` — the page's durable address (its\n * object number). Every service below addresses the wire by it\n * (`/pages/obj:N/…`), keys the manifest by its number, and publishes\n * that number in events.\n */\nexport class CloudPageHandle implements PageHandle {\n readonly annotations: CloudPageAnnotationsService;\n readonly forms: CloudPageFormsService;\n readonly text: CloudPageTextService;\n readonly render: CloudPageRenderService;\n readonly measure: CloudPageMeasureService;\n\n constructor(\n readonly ref: PageRef,\n http: HttpClient,\n docId: string,\n layerName: string,\n isClosed: () => boolean,\n manifest: ManifestAccessor,\n publisher: SessionEventPublisher,\n writes: CloudWrites,\n layout: (signal: AbortSignal) => Promise<PageLayout>,\n layerRights: () => PageLayerRights | null,\n ) {\n this.measure = new CloudPageMeasureService(\n http,\n docId,\n layerName,\n ref,\n isClosed,\n manifest,\n publisher,\n writes,\n );\n this.annotations = new CloudPageAnnotationsService(\n http,\n docId,\n layerName,\n ref,\n isClosed,\n manifest,\n publisher,\n writes,\n );\n this.forms = new CloudPageFormsService(http, docId, layerName, ref, isClosed, manifest);\n this.text = new CloudPageTextService(http, docId, layerName, ref, isClosed, manifest);\n this.render = new CloudPageRenderService(\n http,\n docId,\n layerName,\n ref,\n isClosed,\n manifest,\n layout,\n layerRights,\n );\n }\n}\n","import {\n AbortError,\n EngineError,\n EngineErrorCode,\n type Change,\n type ChangeAnswer,\n type PageCoordinates,\n type WireAnnotationResources,\n} from '@embedpdf/engine-core/runtime';\nimport { CHANGE_REQUEST_LIMITS } from '@embedpdf/engine-core/wire';\n\nimport type { CloudObjectNumberPool, WriteOutcome } from './CloudObjectNumberPool';\nimport type { RequestOptions } from '../transport/HttpClient';\n\n/**\n * One write's place in its document's line (see {@link CloudWrites}): its\n * request goes out once every write called before it has settled.\n */\nexport interface CloudWrite {\n /**\n * Wait for this write's turn, then send its request with `options`: the\n * write's `opId` as `Idempotency-Key`, a top-up when the pool runs low,\n * and the numbers the response hands out back into the pool.\n */\n send<T>(request: (options: RequestOptions) => Promise<T>): Promise<T>;\n}\n\n/** A change as its request sends it: its `opId`, and its ops with the bytes they carry. */\nexport interface SentChange {\n readonly opId: string;\n readonly change: Change<PageCoordinates, WireAnnotationResources>;\n}\n\n/**\n * Sends one request of changes (`POST …/changes`) with `options`, the\n * changes in line order, and answers each, in the same order.\n */\nexport type ChangeSender = (\n changes: readonly SentChange[],\n options: RequestOptions,\n) => Promise<readonly ChangeAnswer[]>;\n\n/** How a change takes its place in the line (see {@link CloudWrites.change}). */\nexport interface LinedChangeOptions {\n /** The object numbers the change creates objects at. */\n readonly named?: readonly number[];\n /**\n * The change carries bytes: it goes in a request of its own, so bytes the\n * server refuses refuse only this change.\n */\n readonly alone?: boolean;\n}\n\n/** A change waiting for its request. */\ninterface LinedChange {\n readonly ready: Promise<SentChange>;\n readonly signal: AbortSignal;\n readonly numbers: readonly number[];\n readonly resolve: (answer: ChangeAnswer) => void;\n readonly reject: (error: unknown) => void;\n}\n\n/** Changes that go out in one request, once it's their turn. */\ninterface Batch {\n readonly changes: LinedChange[];\n}\n\n/**\n * A document's writes, sent one at a time in the order they were called,\n * so the server applies them in that order: a create, then an update of\n * what it made, never the other way round. Reads don't wait.\n *\n * A write takes its place when it is called: `run` must be the first thing\n * a write does, before anything it awaits. What it does before `send`\n * (reading a file to upload, say) happens meanwhile; its turn ends when it\n * settles, after the event it publishes.\n *\n * Changes (`doc.apply`) called one after another share a place: while the\n * write before them is in flight they wait together, and go out as one\n * request when their turn comes, each answered on its own.\n */\nexport class CloudWrites {\n /** Settles when every write so far has settled. */\n private last: Promise<void> = Promise.resolve();\n /** The changes still waiting for their turn, which the next change joins. */\n private open: Batch | null = null;\n\n constructor(\n private readonly pool: CloudObjectNumberPool,\n private readonly sendChanges: ChangeSender = () => {\n throw new EngineError(EngineErrorCode.NotImplemented, 'this line sends no changes');\n },\n ) {}\n\n run<T>(\n opId: string,\n signal: AbortSignal,\n body: (write: CloudWrite) => Promise<T>,\n /** The object numbers the write creates objects at. */\n named: readonly (number | undefined)[] = [],\n ): Promise<T> {\n // A change called after this write goes after it.\n this.open = null;\n const before = this.last;\n const numbers = named.filter((n): n is number => n !== undefined);\n this.pool.beginWrite(numbers);\n const write: CloudWrite = {\n send: async (request) => {\n await untilTurn(before, signal);\n const reserve = this.pool.topUp();\n return request({\n write: {\n opId,\n ...(reserve > 0 ? { reserveObjectNumbers: reserve } : {}),\n onObjectNumbers: (ranges) => this.pool.receive(ranges),\n },\n });\n },\n };\n const settled = body(write).then(\n (result) => {\n this.pool.endWrite(numbers, 'committed');\n return result;\n },\n (error: unknown) => {\n this.pool.endWrite(numbers, outcomeOf(error));\n throw error;\n },\n );\n // The next write waits for this one and, should this one end early (an\n // abort), still for every write before it.\n this.last = before.then(() => settled.then(noop, noop));\n return settled;\n }\n\n /**\n * Take a change's place in the line: it joins the changes waiting for\n * their turn, and goes out with them. `ready` is what the request sends\n * for it, which it may still be preparing (reading bytes). A change aborted\n * before its request goes out is left out of it; once out, it is answered.\n */\n change(\n signal: AbortSignal,\n ready: Promise<SentChange>,\n { named = [], alone = false }: LinedChangeOptions = {},\n ): Promise<ChangeAnswer> {\n this.pool.beginWrite(named);\n // A change that fails to get ready is told so on its turn; until then its\n // failure is expected, not unhandled.\n ready.catch(noop);\n const answer = new Promise<ChangeAnswer>((resolve, reject) => {\n const lined: LinedChange = { ready, signal, numbers: named, resolve, reject };\n const joinable =\n !alone && this.open !== null && this.open.changes.length < CHANGE_REQUEST_LIMITS.changes;\n const batch = joinable ? this.open! : this.queue();\n batch.changes.push(lined);\n if (alone) this.open = null;\n });\n return answer.then(\n (settled) => {\n this.pool.endWrite(named, settledOutcomeOf(settled));\n return settled;\n },\n (error: unknown) => {\n this.pool.endWrite(named, outcomeOf(error));\n throw error;\n },\n );\n }\n\n /** A new batch at the end of the line, open for the changes that follow. */\n private queue(): Batch {\n const before = this.last;\n const batch: Batch = { changes: [] };\n this.open = batch;\n const sent = before.then(() => this.send(batch));\n this.last = sent.then(noop, noop);\n return batch;\n }\n\n /** A batch's turn: nothing joins it any more, and what's ready goes out. */\n private async send(batch: Batch): Promise<void> {\n if (this.open === batch) this.open = null;\n const prepared = await Promise.allSettled(batch.changes.map((lined) => lined.ready));\n const going: { lined: LinedChange; sent: SentChange }[] = [];\n batch.changes.forEach((lined, index) => {\n const ready = prepared[index]!;\n if (lined.signal.aborted) lined.reject(new AbortError(lined.signal.reason ?? 'aborted'));\n else if (ready.status === 'rejected') lined.reject(ready.reason);\n else going.push({ lined, sent: ready.value });\n });\n if (going.length === 0) return;\n const reserve = this.pool.topUp();\n try {\n const answers = await this.sendChanges(\n going.map(({ sent }) => sent),\n {\n write: {\n ...(reserve > 0 ? { reserveObjectNumbers: reserve } : {}),\n onObjectNumbers: (ranges) => this.pool.receive(ranges),\n },\n },\n );\n if (answers.length !== going.length) {\n throw new EngineError(\n EngineErrorCode.WireFormat,\n `${going.length} changes sent, ${answers.length} answered`,\n );\n }\n going.forEach(({ lined }, index) => lined.resolve(answers[index]!));\n } catch (error) {\n for (const { lined } of going) lined.reject(error);\n }\n }\n}\n\nfunction noop(): void {}\n\n/** What a write that failed with `error` did with the numbers it named. */\nfunction outcomeOf(error: unknown): 'refused' | 'failed' {\n return EngineError.is(error, EngineErrorCode.ObjectNumberUnavailable) ? 'refused' : 'failed';\n}\n\n/** What an answered change did with the numbers it named, as a single write's outcome. */\nfunction settledOutcomeOf(answer: ChangeAnswer): WriteOutcome {\n if (answer.status === 'applied') return 'committed';\n return answer.error.code === EngineErrorCode.ObjectNumberUnavailable ? 'refused' : 'failed';\n}\n\n/** `before`, or an `AbortError` once `signal` aborts. */\nfunction untilTurn(before: Promise<void>, signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.reject(new AbortError(signal.reason ?? 'aborted'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => reject(new AbortError(signal.reason ?? 'aborted'));\n signal.addEventListener('abort', onAbort, { once: true });\n void before.then(() => {\n signal.removeEventListener('abort', onAbort);\n resolve();\n });\n });\n}\n","import {\n changeEvents,\n formImportFacts,\n formResetFacts,\n formValuesImportFacts,\n annotationImportFacts,\n deletedAnnotationsOf,\n deletedAttachmentOf,\n deletedFieldOf,\n toPageRef,\n type AnnotationCreateResult,\n type AnnotationImportResult,\n type AnnotationDeleteResult,\n type AnnotationReorderResult,\n type AnnotationUpdateResult,\n type AttachmentCreateResult,\n type AttachmentDeleteResult,\n type ChangeResult,\n type DocumentEvent,\n type EventOrigin,\n type FormFieldCreateResult,\n type FormFieldDeleteResult,\n type FormFieldUpdateResult,\n type FormImportResult,\n type FormValuesImportResult,\n type FormRepairResult,\n type FormResetResult,\n type FormSetValueResult,\n type FormWidgetLinkResult,\n type FormWidgetDeleteResult,\n type FormWidgetUpdateResult,\n type FormWidgetsReorderResult,\n type FormCalculationsReorderResult,\n type MetadataUpdateResult,\n type CustomMetadataUpdateResult,\n type PageDeleteResult,\n type PageFlattenResult,\n type PageInsertResult,\n type PageReorderResult,\n type PageRotateResult,\n type PdfRotation,\n type PageScaleResult,\n type FormFieldRef,\n type SignatureCompleteResult,\n} from '@embedpdf/engine-core/runtime';\nimport { decodePrepared, type SignaturePreparedWire } from '@embedpdf/engine-core/wire';\n\n/** The SSE `mutation` event body — the audit row in JSON (the server's\n * `toJsonlEvent` shape). `payload` is byte-identical to what the mutating\n * caller received as its HTTP response. */\nexport interface AuditEventRow {\n id: number;\n ts: number;\n sub: string;\n kind: string;\n pageObjectNumber: number | null;\n affectedPages: number[];\n originSessionId: string | null;\n /** The request's `Idempotency-Key`, when it named the change. */\n idempotencyKey?: string | null;\n /** On a change that undid another: the `opId` of the change it undid. */\n undoOf?: string | null;\n /**\n * The change holds nothing this connection may read: `payload` is only\n * `{ meta: { cacheDelta } }`, its pins.\n */\n withheld?: boolean;\n payload: unknown;\n}\n\n/**\n * Translate a remote audit row into the `DocumentEvent`s it records — pure,\n * so the exactly-once and verbatim-payload invariants are unit-testable\n * without a server. Most rows are one fact; a change is the events of its\n * items, a form reset is one `forms.valueSet` per field it changed, an\n * import is one `annotations.created` per annotation, and a completed\n * signing is the signature and the new version. An undo's events name the\n * change it undid (`origin.undoOf`). Every event of a row shares `origin.tx`,\n * its id the request's `Idempotency-Key`. Returns none for an own echo and for kinds\n * this engine version doesn't know (a newer server's events degrade to\n * \"ignored\", never to a crash).\n *\n * Context-field fidelity differs by op, by design of the audit row:\n * - rotate/delete: `affectedPages` is exactly the op's page set; rotation\n * is recovered from the layout (it's absolute — every affected page\n * carries the value).\n * - reorder: the payload is the result, as the originator got it: the\n * pages that moved and the new `layout`.\n *\n * The audit row keys pages by object number (its storage identity); the\n * event carries them as `PageRef` addresses, like every other event.\n */\nexport function auditRowToEvents(row: AuditEventRow, mySessionId: string): DocumentEvent[] {\n if (row.originSessionId === mySessionId) return []; // own echo — local publish covered it\n if (row.withheld) return []; // nothing this connection may read: no facts, only pins\n\n const origin: EventOrigin = {\n kind: 'remote',\n sessionId: row.originSessionId ?? `unknown:${row.sub}`,\n sub: row.sub,\n ts: row.ts,\n serverId: row.id,\n ...(row.undoOf ? { undoOf: row.undoOf } : {}),\n };\n // Every event of the write shares its id: the request's `Idempotency-Key`,\n // or the row's own id when it came without one.\n const id = row.idempotencyKey ?? `audit:${row.id}`;\n const events = factsOf(row, origin);\n return events.map((event, index) => ({\n ...event,\n origin: { ...origin, tx: { id, index, count: events.length } },\n }));\n}\n\n/** The events a row records, in order, or none for a kind this version doesn't know. */\nfunction factsOf(row: AuditEventRow, origin: EventOrigin): DocumentEvent[] {\n if (row.kind === 'change') {\n // A change is the events its items publish, in op order, as locally.\n return changeEvents(row.payload as ChangeResult).map(\n (event) => ({ ...event, origin }) as DocumentEvent,\n );\n }\n if (row.kind === 'annot.import') {\n return annotationImportFacts(row.payload as AnnotationImportResult).map((fact) => ({\n type: 'annotations.created',\n origin,\n ...fact,\n }));\n }\n if (row.kind === 'form.import') {\n // One `forms.created` per field the import made, as locally.\n return formImportFacts(row.payload as FormImportResult).map((fact) => ({\n type: 'forms.created',\n origin,\n ...fact,\n }));\n }\n if (row.kind === 'form.importValues') {\n // One `forms.valueSet` per field the import filled, as locally.\n return formValuesImportFacts(row.payload as FormValuesImportResult).map((fact) => ({\n type: 'forms.valueSet',\n origin,\n ...fact,\n }));\n }\n if (row.kind === 'form.reset') {\n // One `forms.valueSet` per field the reset changed, as locally.\n return formResetFacts(row.payload as FormResetResult).map((fact) => ({\n type: 'forms.valueSet',\n origin,\n ...fact,\n }));\n }\n if (row.kind === 'signature.complete') {\n // A completion is two facts, as locally: the sealed signature, and the\n // document on a new version.\n const { signingId, ...result } = row.payload as { signingId: string } & SignatureCompleteResult;\n return [\n { type: 'signatures.completed', origin, signingId, ...result },\n { type: 'document.versioned', origin, version: result.version },\n ];\n }\n const event = eventOf(row, origin);\n return event ? [event] : [];\n}\n\n/** The one event a single-fact row records, or `null` for a kind this version doesn't know. */\nfunction eventOf(row: AuditEventRow, origin: EventOrigin): DocumentEvent | null {\n // The row's page: its explicit column, else the first affected page.\n const rowPage = () => toPageRef(row.pageObjectNumber ?? row.affectedPages[0] ?? 0);\n const affectedPages = () =>\n row.affectedPages.map((pageObjectNumber) => toPageRef(pageObjectNumber));\n\n switch (row.kind) {\n case 'measure.setScale':\n return { type: 'pages.scaleSet', origin, ...(row.payload as PageScaleResult) };\n case 'annot.create':\n return {\n type: 'annotations.created',\n page: rowPage(),\n origin,\n ...(row.payload as AnnotationCreateResult),\n };\n case 'annot.update':\n return {\n type: 'annotations.updated',\n page: rowPage(),\n origin,\n ...(row.payload as AnnotationUpdateResult),\n };\n case 'annot.delete':\n return {\n type: 'annotations.deleted',\n page: rowPage(),\n origin,\n deleted: deletedAnnotationsOf(row.payload as AnnotationDeleteResult),\n ...(row.payload as AnnotationDeleteResult),\n };\n case 'annot.reorder':\n return {\n type: 'annotations.reordered',\n page: rowPage(),\n origin,\n ...(row.payload as AnnotationReorderResult),\n };\n case 'pages.reorder':\n return { type: 'pages.reordered', origin, ...(row.payload as PageReorderResult) };\n case 'pages.rotate': {\n const payload = row.payload as PageRotateResult;\n const rotation = (payload.layout.pages.find(\n (page) => page.ref.objectNumber === row.affectedPages[0],\n )?.rotation ?? 0) as PdfRotation;\n return {\n type: 'pages.rotated',\n pages: affectedPages(),\n rotation,\n origin,\n ...payload,\n };\n }\n case 'pages.delete':\n return {\n type: 'pages.deleted',\n pages: affectedPages(),\n origin,\n ...(row.payload as PageDeleteResult),\n };\n // Two audit kinds share the `pages.inserted` event (bytes-import and\n // blank creation produce the same result shape) — the audit log keeps\n // them distinct for history, the event stream cares about effect.\n case 'pages.insert':\n case 'pages.insertBlank':\n return {\n type: 'pages.inserted',\n origin,\n ...(row.payload as PageInsertResult),\n };\n case 'pages.flatten':\n return {\n type: 'pages.flattened',\n origin,\n ...(row.payload as PageFlattenResult),\n };\n case 'metadata.update':\n return {\n type: 'metadata.updated',\n origin,\n ...(row.payload as MetadataUpdateResult),\n };\n case 'metadata.updateCustom':\n return {\n type: 'metadata.customUpdated',\n origin,\n ...(row.payload as CustomMetadataUpdateResult),\n };\n case 'attachment.create':\n return {\n type: 'attachments.created',\n origin,\n ...(row.payload as AttachmentCreateResult),\n };\n case 'attachment.delete':\n return {\n type: 'attachments.deleted',\n origin,\n deleted: deletedAttachmentOf(row.payload as AttachmentDeleteResult),\n ...(row.payload as AttachmentDeleteResult),\n };\n // A value write is one `forms.valueSet`; a reset and an import are one\n // per field they changed (above).\n case 'form.setValue':\n return { type: 'forms.valueSet', origin, ...(row.payload as FormSetValueResult) };\n case 'form.repair':\n return { type: 'forms.repaired', origin, ...(row.payload as FormRepairResult) };\n case 'form.createField':\n return { type: 'forms.created', origin, ...(row.payload as FormFieldCreateResult) };\n case 'form.updateField':\n case 'form.setSignatureAppearance':\n return { type: 'forms.updated', origin, ...(row.payload as FormFieldUpdateResult) };\n case 'form.deleteField': {\n const result = row.payload as FormFieldDeleteResult;\n return { type: 'forms.deleted', origin, deleted: deletedFieldOf(result), ...result };\n }\n case 'form.addWidget':\n return { type: 'forms.widgetAdded', origin, ...(row.payload as FormWidgetLinkResult) };\n case 'form.detachWidget':\n return { type: 'forms.widgetRemoved', origin, ...(row.payload as FormWidgetLinkResult) };\n case 'form.updateWidget':\n return { type: 'forms.widgetUpdated', origin, ...(row.payload as FormWidgetUpdateResult) };\n case 'form.deleteWidget':\n return { type: 'forms.widgetDeleted', origin, ...(row.payload as FormWidgetDeleteResult) };\n case 'form.reorderWidgets':\n return {\n type: 'forms.widgetsReordered',\n origin,\n ...(row.payload as FormWidgetsReorderResult),\n };\n case 'form.reorderCalculations':\n return {\n type: 'forms.calculationsReordered',\n origin,\n ...(row.payload as FormCalculationsReorderResult),\n };\n case 'signature.prepare': {\n const { field, ...wire } = row.payload as { field: FormFieldRef } & SignaturePreparedWire;\n return { type: 'signatures.prepared', origin, field, ...decodePrepared(wire) };\n }\n case 'signature.cancel':\n return {\n type: 'signatures.cancelled',\n origin,\n signingId: (row.payload as { signingId: string }).signingId,\n };\n default:\n return null;\n }\n}\n","import {\n EngineError,\n EngineErrorCode,\n type EditSessionStatus,\n} from '@embedpdf/engine-core/runtime';\nimport { EditSessionStatusSchema } from '@embedpdf/engine-core/wire';\n\nimport type { AuditEventRow } from './auditRowToEvents';\nimport type { HttpClient } from '../transport/HttpClient';\n\nexport interface SseClientOptions {\n http: HttpClient;\n path: string;\n /** Resume cursor for the first connect (manifest `auditHead` /\n * `lastServerId`); `null` subscribes \"from now\". */\n initialCursor: number | null;\n /** One parsed audit row, in id order. The cursor has already advanced. */\n onRow(row: AuditEventRow): void;\n /** Server says the gap is too large to replay — refetch state. */\n onFullRefresh(): void;\n /** Auth is permanently gone (401/403); the client stopped for good. */\n onAuthLost(): void;\n /** The editing session's `session` event: every object number it holds, and its expiry. */\n onSession?(status: EditSessionStatus): void;\n /** The stream is up (`true`) or down (`false`). */\n onConnected?(connected: boolean): void;\n}\n\n/**\n * Fetch-based SSE consumer. Browser-native `EventSource` cannot send an\n * `Authorization` header, so the stream rides the same `HttpClient` as\n * every other request (same token provider, same session header).\n *\n * Resilience model: the cursor is the only state that matters. Every\n * (re)connect sends `Last-Event-ID: cursor`; the server replays the gap\n * from the audit log. So a dropped stream costs latency, never events —\n * the client needs no buffering and no acknowledgements.\n *\n * - network drop / server close / `auth-expiring` → reconnect with\n * jittered exponential backoff (500ms → 30s; reset after a stream\n * that lived ≥30s). `auth-expiring` reconnects pick up a fresh token\n * from the HttpClient's provider automatically.\n * - 401/403 → permanent: `onAuthLost`, no retry loop against a dead\n * credential.\n */\nexport class SseClient {\n private cursor: number | null;\n private closed = false;\n private abort: AbortController | null = null;\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n private retryDelayMs = 500;\n\n constructor(private readonly opts: SseClientOptions) {\n this.cursor = opts.initialCursor;\n }\n\n open(): void {\n if (this.closed) return;\n void this.run();\n }\n\n close(): void {\n this.closed = true;\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.abort?.abort();\n }\n\n get lastEventId(): number | null {\n return this.cursor;\n }\n\n private async run(): Promise<void> {\n const startedAt = Date.now();\n this.abort = new AbortController();\n try {\n const res = await this.opts.http.stream(\n this.opts.path,\n this.cursor !== null ? { 'Last-Event-ID': String(this.cursor) } : {},\n this.abort.signal,\n );\n if (res.status === 401 || res.status === 403) {\n this.closed = true;\n this.opts.onAuthLost();\n return;\n }\n if (!res.ok || !res.body) {\n throw new EngineError(EngineErrorCode.Network, `events stream HTTP ${res.status}`);\n }\n this.opts.onConnected?.(true);\n try {\n await this.consume(res.body);\n } finally {\n this.opts.onConnected?.(false);\n }\n // Stream ended (server close / auth-expiring / network): reconnect.\n if (Date.now() - startedAt >= 30_000) this.retryDelayMs = 500;\n } catch {\n // Aborts land here too; `closed` guards the reschedule below.\n }\n if (this.closed) return;\n const jitter = this.retryDelayMs * (0.5 + Math.random() * 0.5);\n this.retryTimer = setTimeout(() => void this.run(), jitter);\n this.retryDelayMs = Math.min(this.retryDelayMs * 2, 30_000);\n }\n\n private async consume(body: ReadableStream<Uint8Array>): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n for (;;) {\n const { done, value } = await reader.read();\n if (done || this.closed) return;\n buffer += decoder.decode(value, { stream: true });\n for (;;) {\n const sep = buffer.indexOf('\\n\\n');\n if (sep < 0) break;\n const block = buffer.slice(0, sep);\n buffer = buffer.slice(sep + 2);\n this.dispatch(block);\n }\n }\n }\n\n private dispatch(block: string): void {\n if (block.startsWith(':')) return; // heartbeat / comment\n let id: number | null = null;\n let event = 'message';\n const data: string[] = [];\n for (const line of block.split('\\n')) {\n if (line.startsWith('id:')) id = Number(line.slice(3).trim());\n else if (line.startsWith('event:')) event = line.slice(6).trim();\n else if (line.startsWith('data:')) data.push(line.slice(5).trim());\n }\n if (id !== null && Number.isFinite(id)) this.cursor = id;\n if (event === 'mutation') {\n try {\n this.opts.onRow(JSON.parse(data.join('\\n')) as AuditEventRow);\n } catch {\n // A malformed row advances the cursor and is skipped; the audit log\n // remains the source of truth for anyone who refetches.\n }\n } else if (event === 'session') {\n const parsed = safeJson(data.join('\\n'));\n const status = EditSessionStatusSchema.safeParse(parsed);\n if (status.success) this.opts.onSession?.(status.data);\n } else if (event === 'full-refresh') {\n this.opts.onFullRefresh();\n } else if (event === 'auth-revoked') {\n // Terminal: the credential is dead by decree, not by clock — never\n // retry against it (a reconnect would just 401; this saves the trip\n // and surfaces the loss immediately).\n this.closed = true;\n this.abort?.abort();\n this.opts.onAuthLost();\n }\n // 'auth-expiring' needs no handling: the server ends the stream right\n // after, and the reconnect path fetches a fresh token.\n }\n}\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n","import {\n AbortablePromise,\n DEFAULT_BUNDLE_LIMITS,\n DEFAULT_PDF_SAVE_MODE,\n EngineError,\n EngineErrorCode,\n EventHub,\n SessionEventPublisher,\n subscribeToType,\n type DocumentAnnotationsService,\n type DocumentActionsService,\n type DocumentAttachmentsService,\n type DocumentSignaturesService,\n type DocumentEvent,\n type DocumentEventStream,\n type DocumentFormsService,\n type DocumentHandle,\n type DocumentRedactionService,\n CONTINUOUS_RENDER_POLICY,\n type DocumentRenderService,\n type DocumentSecurityService,\n type MutationMeta,\n type PageHandle,\n type PageRef,\n type DownloadOptions,\n type CallFacts,\n type Change,\n type ChangeResult,\n type WorkingSetPage,\n type ObjectNumberPool,\n type WriteOptions,\n} from '@embedpdf/engine-core/runtime';\nimport {\n DEFAULT_LAYER_NAME,\n DocumentHeadSchema,\n DocumentManifestSchema,\n ObjectNumberReservationResponseSchema,\n wirePaths,\n type DocumentHead,\n type DocumentManifest,\n type LayerScopePlane,\n} from '@embedpdf/engine-core/wire';\n\nimport { CloudDocumentActionsService } from './CloudDocumentActionsService';\nimport { CloudDocumentAnnotationsService } from './CloudDocumentAnnotationsService';\nimport { CloudDocumentAttachmentsService } from './CloudDocumentAttachmentsService';\nimport { changeSender, CloudDocumentChanges } from './CloudDocumentChanges';\nimport { CloudDocumentFormsService } from './CloudDocumentFormsService';\nimport { CloudDocumentPagesService } from './CloudDocumentPagesService';\nimport { CloudDocumentRedactionService } from './CloudDocumentRedactionService';\nimport { CloudDocumentSearchService } from './CloudDocumentSearchService';\nimport { CloudDocumentSecurityService } from './CloudDocumentSecurityService';\nimport { CloudDocumentSignaturesService } from './CloudDocumentSignaturesService';\nimport { CloudMetadataService } from './CloudMetadataService';\nimport { CloudObjectNumberPool } from './CloudObjectNumberPool';\nimport { CloudPageHandle } from './CloudPageHandle';\nimport { CloudWrites } from './CloudWrites';\nimport { auditRowToEvents } from '../realtime/auditRowToEvents';\nimport { SseClient } from '../realtime/SseClient';\nimport { awaitSignal } from '../shared/awaitSignal';\nimport type { HttpClient } from '../transport/HttpClient';\n\n/**\n * Read accessor handed to every `CloudPage…Service`. The closure\n * captures `this` so the services don't carry a direct reference\n * back to the document handle (smaller circular-ref surface, easier\n * to mock in unit tests).\n */\nexport interface ManifestAccessor {\n /** Cached manifest (cold-fetched once, kept across requests). */\n get(signal: AbortSignal): Promise<DocumentManifest>;\n /** Force re-fetch of `/head` + `/manifest@docVersion=N`; replaces the cache. */\n refresh(signal: AbortSignal): Promise<DocumentManifest>;\n /**\n * Absorb mutation-returned state/cache deltas when safe. `owns` names the\n * planes this mutation kind takes ownership of (the monotone-flip\n * rule): annotation/form writes own `annotations`; flatten and\n * redaction-apply own `content + annotations`. The flip runs even when\n * the version-gated delta merge is skipped — scopes only ever move\n * base → layer, so any observed mutation proves the plane diverged.\n */\n apply(meta: MutationMeta, owns: readonly LayerScopePlane[]): void;\n /** A page delete: the advance, plus dropping the deleted pages' manifest\n * rows so per-page leaf URLs stop resolving locally. */\n applyPageDelete(meta: MutationMeta, deletedPages: readonly PageRef[]): void;\n /** Page insert: the cached manifest has no rows for the fresh page object numbers (the\n * result carries only their object numbers), so the absorb drops the\n * cache for a lazy refetch instead of patching. */\n applyPageInsert(meta: MutationMeta): void;\n}\n\nexport class CloudDocumentHandle implements DocumentHandle {\n readonly id: string;\n readonly metadata: CloudMetadataService;\n readonly annotations: DocumentAnnotationsService;\n readonly actions: DocumentActionsService;\n readonly attachments: DocumentAttachmentsService;\n readonly signatures: DocumentSignaturesService;\n readonly forms: DocumentFormsService;\n readonly search: CloudDocumentSearchService;\n readonly pages: CloudDocumentPagesService;\n readonly redaction: DocumentRedactionService;\n readonly security: DocumentSecurityService;\n readonly render: DocumentRenderService;\n readonly events: DocumentEventStream;\n readonly objectNumbers: ObjectNumberPool;\n private readonly pool: CloudObjectNumberPool;\n private readonly writes: CloudWrites;\n private readonly changes: CloudDocumentChanges;\n private readonly publisher: SessionEventPublisher;\n private readonly hub: EventHub;\n private readonly sessionId: string;\n private sseClient: SseClient | null = null;\n private sseSubscribers = 0;\n private closed = false;\n\n /**\n * Cached current manifest. Populated on first read by `getManifest`\n * (or any `page().*` call that needs to know a version). Replaced\n * wholesale on `refreshManifest`. Cleared on `close`.\n *\n * Memory model: one DocumentManifest per open handle. Per-page\n * version reads are O(pages.length) `.find(...)` lookups; if a\n * profiling pass ever shows that as hot, swap for a Map keyed by\n * `pageObjectNumber`. Today's documents are page-sparse so the\n * scan is cheaper than the hash overhead.\n */\n private manifestCache: DocumentManifest | null = null;\n private inflightManifest: Promise<DocumentManifest> | null = null;\n private manifestFloorVersion = 0;\n private pendingInitialHead: DocumentHead | null;\n\n private readonly manifestAccessor: ManifestAccessor;\n private readonly cloudSecurity: CloudDocumentSecurityService;\n\n constructor(\n private readonly http: HttpClient,\n id: string,\n private readonly layerName: string = DEFAULT_LAYER_NAME,\n initialHead?: DocumentHead,\n /**\n * The doc-scoped JWT the engine was opened with, decoded\n * unverified to populate the security service's local-fallback\n * `effectiveScope` / `identity` accessors. Optional for backward\n * compatibility; without it the local-fallback path returns an\n * empty scope and null identity until /access is called.\n */\n initialToken: string | null = null,\n /** Called once, when the handle closes (the engine forgets it). */\n private readonly onClose: () => void = () => {},\n ) {\n this.id = id;\n this.pendingInitialHead = initialHead ?? null;\n // The editing session's object numbers: from `/access`, write\n // responses, the stream's `session` events and the bulk reservation.\n const pool = new CloudObjectNumberPool({\n reserve: (count, signal) =>\n http.postJson(\n wirePaths.objectNumbers(id, layerName),\n { count },\n (raw) => ObjectNumberReservationResponseSchema.parse(raw),\n signal,\n { session: true },\n ),\n });\n this.pool = pool;\n this.objectNumbers = pool;\n this.writes = new CloudWrites(pool, changeSender(http, id, layerName));\n const security = new CloudDocumentSecurityService(\n http,\n id,\n layerName,\n initialHead ?? fallbackUnknownHead(id),\n { isClosed: () => this.closed },\n initialToken,\n { wanted: () => pool.wantedAtAccess(), opened: (edit) => pool.opened(edit) },\n );\n this.security = security;\n this.cloudSecurity = security;\n // The deployment's render lattice rides /v1/access (mutable policy\n // never lives in immutable manifests). Reuse the cached access block\n // when present; otherwise establish access on demand — the same call\n // the CDN path uses, so this can never add a second handshake shape.\n // A pre-lattice server (no renderPolicy field) enforces nothing:\n // `continuous` is the honest answer.\n this.render = {\n getPolicy: () =>\n AbortablePromise.run(async () => {\n const cached =\n security.currentAccess ?? (await security.establishAccess()).access ?? null;\n const advertised = cached?.renderPolicy;\n if (!advertised) return CONTINUOUS_RENDER_POLICY;\n return {\n kind: 'lattice',\n fullPage: { widths: advertised.fullPage.widths },\n ...(advertised.tiles ? { tiles: advertised.tiles } : {}),\n ...(advertised.appearances ? { appearances: advertised.appearances } : {}),\n ...(advertised.maxRenderPixels !== undefined\n ? { maxRenderPixels: advertised.maxRenderPixels }\n : {}),\n formats: advertised.formats,\n background: advertised.background,\n enforced: advertised.enforced,\n };\n }),\n };\n const hub = new EventHub();\n this.hub = hub;\n // The handle's session is its client's: the id its writes carry, its\n // events' origin. A client without one (a test's) still names the origin.\n const sessionId = http.sessionId ?? `cloud:anon:${id}`;\n this.sessionId = sessionId;\n // Your own mutations publish here at POST-confirmation time (kind:\n // 'local'); the remote channel (SSE) publishes everyone else's into the\n // same hub. Exactly one event per mutation, either way. The SSE stream\n // is lazy: it opens on the first subscriber and closes on the last —\n // non-collaborative usage never holds a connection (browsers cap ~6\n // per origin on HTTP/1.1).\n const subscribe: DocumentEventStream['subscribe'] = (listener) => {\n const unsubscribe = hub.subscribe(listener);\n this.retainRemoteStream();\n let released = false;\n return () => {\n unsubscribe();\n if (!released) {\n released = true;\n this.releaseRemoteStream();\n }\n };\n };\n this.events = {\n subscribe,\n on: (type, listener) => subscribeToType(subscribe, type, listener),\n lastServerId: () => hub.lastServerId(),\n };\n this.publisher = new SessionEventPublisher(hub, sessionId);\n // A version this handle published itself numbers objects anew too.\n hub.subscribe((event) => {\n if (event.type === 'document.versioned') pool.versioned(event.version.sha256);\n });\n this.manifestAccessor = {\n get: (signal) => this.getManifest(signal),\n refresh: (signal) => this.refreshManifest(signal),\n apply: (meta, owns) => this.absorbMutation(meta, owns),\n applyPageDelete: (meta, deletedPages) => this.absorbPageDelete(meta, deletedPages),\n applyPageInsert: (meta) => this.absorbPageInsert(meta),\n };\n this.changes = new CloudDocumentChanges(\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n this.writes,\n );\n this.metadata = new CloudMetadataService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n this.writes,\n );\n // The deployment's import limits ride /v1/access, as the render lattice does.\n const importLimits = async () =>\n (security.currentAccess ?? (await security.establishAccess()).access)?.bundleLimits ??\n DEFAULT_BUNDLE_LIMITS;\n this.annotations = new CloudDocumentAnnotationsService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n this.writes,\n importLimits,\n );\n this.actions = new CloudDocumentActionsService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n );\n this.attachments = new CloudDocumentAttachmentsService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n this.writes,\n );\n this.signatures = new CloudDocumentSignaturesService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n this.writes,\n );\n this.forms = new CloudDocumentFormsService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n this.writes,\n importLimits,\n );\n this.search = new CloudDocumentSearchService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n );\n this.pages = new CloudDocumentPagesService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n this.writes,\n );\n this.redaction = new CloudDocumentRedactionService(\n http,\n id,\n layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n this.writes,\n );\n }\n\n page(ref: PageRef): PageHandle {\n return new CloudPageHandle(\n ref,\n this.http,\n this.id,\n this.layerName,\n () => this.closed,\n this.manifestAccessor,\n this.publisher,\n this.writes,\n (signal) => this.pages.pageLayout(ref, signal),\n () => this.cloudSecurity.pageLayerRights(),\n );\n }\n\n /**\n * This handle: the cloud engine sends every call as it's made, in\n * parallel, and the server runs them in arrival order, so a call's facts\n * change nothing here.\n */\n with(_facts: CallFacts): DocumentHandle {\n return this;\n }\n\n /** One change as one transaction, or the undo of one (see `DocumentHandle.apply`). */\n apply(change: Change, options?: WriteOptions): AbortablePromise<ChangeResult> {\n return this.changes.apply(change, options);\n }\n\n /** Ignored: the server learns what's needed from what is asked of it. */\n setWorkingSet(_view: string, _pages: readonly WorkingSetPage[]): void {}\n\n download(options: DownloadOptions = {}): AbortablePromise<Uint8Array> {\n if (this.closed) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.DocNotOpen, `document ${this.id} is closed`),\n );\n }\n const mode = options.mode ?? DEFAULT_PDF_SAVE_MODE;\n return AbortablePromise.run<Uint8Array>(async (signal) => {\n const buildPath = async () => {\n const manifest = await this.getManifest(signal);\n return wirePaths.layerDownloadVersioned(this.id, this.layerName, {\n docVersion: manifest.docVersion,\n mode,\n });\n };\n try {\n return await this.http.getBytes(await buildPath(), signal);\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n await this.refreshManifest(signal);\n return this.http.getBytes(await buildPath(), signal);\n }\n });\n }\n\n /**\n * Learn what the document's signatures forbid before the caller's first\n * question: the manifest carries it, so `open()` fetches it up front and\n * `security.allows()` answers as the server would from the start. A locked\n * document, which the server won't describe yet, learns it from `unlock()`.\n */\n async learnProtection(signal: AbortSignal): Promise<void> {\n try {\n await this.getManifest(signal);\n } catch (error) {\n if (EngineError.is(error, EngineErrorCode.DocPasswordRequired)) return;\n throw error;\n }\n }\n\n /**\n * Return the cached manifest, fetching cold-cache once if needed.\n * Concurrent callers share a single inflight request (singleflight)\n * so an N-page handle that opens N services in parallel still\n * triggers exactly one `/head` + `/manifest@docVersion=N` round-trip.\n */\n async getManifest(signal: AbortSignal): Promise<DocumentManifest> {\n if (this.manifestCache) return this.manifestCache;\n if (!this.inflightManifest) {\n this.startManifestFetch({ allowInitialHead: true });\n }\n const promise = this.inflightManifest;\n if (!promise) {\n throw new EngineError(\n EngineErrorCode.Unknown,\n `manifest fetch was not started for document ${this.id}`,\n );\n }\n return awaitSignal(promise, signal);\n }\n\n /**\n * Force re-fetch. Used by the transparent-retry path when a leaf\n * URL returns 404 (stale version). Replaces `manifestCache`\n * wholesale so the next `getManifest()` is a Map lookup.\n */\n async refreshManifest(signal: AbortSignal): Promise<DocumentManifest> {\n const promise = this.startManifestFetch({ allowInitialHead: false });\n return awaitSignal(promise, signal);\n }\n\n /**\n * Monotone plane-scope flip: mark the planes a mutation owns as layer-scoped in\n * the cached manifest. Scopes only ever move base → layer (no revert op\n * exists), so flipping is safe under any event ordering — a duplicate or\n * out-of-order event still proves the plane diverged at some point — and\n * the manifest fetch stays the authoritative source (the 404 → refresh\n * rail heals any miss, e.g. a future mutation kind this client doesn't\n * know about).\n */\n private flipScopes(owns: readonly LayerScopePlane[]): void {\n const cache = this.manifestCache;\n const scopes = cache?.scopes;\n if (!cache || !scopes) return;\n if (owns.every((plane) => scopes[plane] === 'layer')) return;\n const next = { ...scopes };\n for (const plane of owns) next[plane] = 'layer';\n this.manifestCache = { ...cache, scopes: next };\n }\n\n absorbMutation(meta: MutationMeta, owns: readonly LayerScopePlane[]): void {\n this.flipScopes(owns);\n const delta = meta.cacheDelta;\n if (delta) {\n this.manifestFloorVersion = Math.max(this.manifestFloorVersion, delta.docVersion);\n }\n this.inflightManifest = null;\n\n if (!this.manifestCache) return;\n if (delta) {\n if (delta.docVersion <= this.manifestCache.docVersion) return;\n if (delta.previousDocVersion !== this.manifestCache.docVersion) {\n this.manifestCache = null;\n return;\n }\n }\n\n const byPageObjectNumber = new Map(\n this.manifestCache.pages.map((page) => [page.page.objectNumber, page]),\n );\n if (delta) {\n for (const page of delta.pages) {\n const existing = byPageObjectNumber.get(page.page.objectNumber);\n if (existing) {\n byPageObjectNumber.set(page.page.objectNumber, {\n ...existing,\n cache: page.cache,\n });\n }\n }\n }\n this.manifestCache = {\n ...this.manifestCache,\n docVersion: delta?.docVersion ?? this.manifestCache.docVersion,\n // The document pins of the annotation list and the form: absorbed when\n // the mutation bumped them, so the next `annotations.list()` or\n // `forms.list()` addresses the fresh leaf without a 404-refresh round\n // trip.\n ...(delta?.annotationsVersion !== undefined\n ? { annotationsVersion: delta.annotationsVersion }\n : {}),\n ...(delta?.formsVersion !== undefined ? { formsVersion: delta.formsVersion } : {}),\n // The plane pins a page-structure, metadata or attachment write bumps:\n // absorbed so the next read addresses the fresh leaf.\n ...(delta?.layoutVersion !== undefined ? { layoutVersion: delta.layoutVersion } : {}),\n ...(delta?.metadataVersion !== undefined ? { metadataVersion: delta.metadataVersion } : {}),\n ...(delta?.attachmentsVersion !== undefined\n ? { attachmentsVersion: delta.attachmentsVersion }\n : {}),\n // The signing fences: every ordinary commit writes an artifact\n // (`working`), and the layer's write serial when the delta names it.\n ...(delta?.layerVersion !== undefined ? { layerVersion: delta.layerVersion } : {}),\n ...(delta?.working !== undefined ? { working: delta.working } : {}),\n // The manifest is a per-page registry keyed by pageObjectNumber, not a\n // display-order list — geometry/order now lives in `pages.list()`\n // (/layout). Keep a deterministic order by page object number so cache merges are\n // stable; display order is the SDK's concern via PageLayout.index.\n pages: Array.from(byPageObjectNumber.values()).sort(\n (a, b) => a.page.objectNumber - b.page.objectNumber,\n ),\n };\n }\n\n /**\n * Patch the cached manifest after a page delete: the shared advance plus\n * dropping the deleted pages' manifest rows, so no leaf URL for a retired\n * page object number can be built from the cache (a stale request would\n * 404 anyway — this keeps the failure local and instant). Delete changes\n * the page set: a view that removed content must never resolve base\n * artifacts again, so content, annotations and forms flip with layout.\n */\n private absorbPageDelete(meta: MutationMeta, deletedPages: readonly PageRef[]): void {\n this.absorbMutation(meta, ['layout', 'content', 'annotations', 'forms']);\n if (!this.manifestCache) return;\n const deleted = new Set(deletedPages.map((page) => page.objectNumber));\n this.manifestCache = {\n ...this.manifestCache,\n pages: this.manifestCache.pages.filter((page) => !deleted.has(page.page.objectNumber)),\n };\n }\n\n /**\n * Patch bookkeeping after a page insert — the mirror of\n * {@link absorbPageDelete}, with one asymmetry: delete can patch the\n * cached manifest losslessly (it only removes rows), but an insert needs\n * manifest rows for the fresh page object numbers and the result doesn't carry them. So\n * this absorb flips the planes (insert changes the page set, so like\n * delete it owns content, annotations and forms alongside layout), raises the\n * version floor, and drops the cache — the next read refetches a manifest\n * that includes the new pages' rows. The UI never waits on that refetch:\n * the mutation result / event already carries the full new layout.\n */\n private absorbPageInsert(meta: MutationMeta): void {\n this.flipScopes(['layout', 'content', 'annotations', 'forms']);\n if (meta.cacheDelta) {\n this.manifestFloorVersion = Math.max(this.manifestFloorVersion, meta.cacheDelta.docVersion);\n }\n this.inflightManifest = null;\n this.manifestCache = null;\n }\n\n private startManifestFetch(opts: { allowInitialHead: boolean }): Promise<DocumentManifest> {\n const ctrl = new AbortController();\n const promise = this.fetchManifest(ctrl.signal, opts);\n this.inflightManifest = promise;\n promise\n .then((manifest) => {\n if (\n manifest.docVersion >= this.manifestFloorVersion &&\n (!this.manifestCache || manifest.docVersion >= this.manifestCache.docVersion)\n ) {\n this.manifestCache = manifest;\n this.cloudSecurity.setProtection(manifest.protection);\n }\n })\n .catch(() => undefined)\n .finally(() => {\n if (this.inflightManifest === promise) {\n this.inflightManifest = null;\n }\n });\n return promise;\n }\n\n private async fetchManifest(\n signal: AbortSignal,\n opts: { allowInitialHead: boolean },\n ): Promise<DocumentManifest> {\n if (this.closed) {\n throw new EngineError(EngineErrorCode.DocNotOpen, `document ${this.id} is closed`);\n }\n const head = opts.allowInitialHead ? this.consumeInitialHead() : null;\n if (head) {\n try {\n return await this.fetchManifestForHead(head, signal);\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n // A mutation may have landed between open() and the first\n // manifest read. The seed is one-shot, so fall through to the\n // normal /head path and learn the current docVersion.\n }\n }\n\n // Refreshes and stale-seed recovery always re-fetch `/head` first\n // so we learn the current `docVersion`; chasing the manifest with\n // a stale `:D` would 404 by definition.\n const freshHead = await this.http.getJson(\n wirePaths.layerHead(this.id, this.layerName),\n (raw) => DocumentHeadSchema.parse(raw),\n signal,\n );\n return this.fetchManifestForHead(freshHead, signal);\n }\n\n private consumeInitialHead(): DocumentHead | null {\n const head = this.pendingInitialHead;\n this.pendingInitialHead = null;\n return head;\n }\n\n private fetchManifestForHead(head: DocumentHead, signal: AbortSignal): Promise<DocumentManifest> {\n return this.http.getJson(\n wirePaths.layerManifest(this.id, this.layerName, head.docVersion),\n (raw) => DocumentManifestSchema.parse(raw),\n signal,\n );\n }\n\n close(): AbortablePromise<void> {\n if (this.closed) {\n return AbortablePromise.resolveValue<void>(undefined);\n }\n this.closed = true;\n this.sseClient?.close();\n this.sseClient = null;\n this.manifestCache = null;\n this.inflightManifest = null;\n this.onClose();\n return AbortablePromise.resolveValue<void>(undefined);\n }\n\n private retainRemoteStream(): void {\n this.sseSubscribers += 1;\n if (this.sseSubscribers > 1 || this.closed || this.sseClient) return;\n this.sseClient = new SseClient({\n http: this.http,\n path: wirePaths.layerEvents(this.id, this.layerName),\n // Gapless handshake: resume from the newest cursor we know — events\n // already seen, else the cached manifest's transactional auditHead.\n // Null (cold start, no manifest yet) subscribes \"from now\", which is\n // exact too: the first manifest fetched afterwards is newer anyway.\n initialCursor: this.hub.lastServerId() ?? this.manifestCache?.auditHead ?? null,\n onRow: (row) => {\n // Advance the cached manifest's audit cursor — own echoes and\n // unknown kinds included — so a later `annotations.list()` never stamps a\n // cursor older than the pins the absorbed cache hands it.\n if (this.manifestCache && row.id > this.manifestCache.auditHead) {\n this.manifestCache = { ...this.manifestCache, auditHead: row.id };\n }\n // A change this connection may not read: the server sent only its\n // pins, absorbed so reads stay warm. Which family it changed is part\n // of what was withheld, so both planes flip: never wrong, only\n // unshared until the next manifest.\n if (row.withheld) {\n const meta = (row.payload as { meta?: MutationMeta } | null)?.meta;\n if (meta && row.originSessionId !== this.sessionId) {\n this.absorbMutation(meta, ['annotations', 'forms']);\n }\n return;\n }\n // A new version, this handle's own included: in stream order, before\n // the `session` event that hands out its fresh numbers.\n if (row.kind === 'signature.complete') {\n const sha = (row.payload as { version?: { sha256?: unknown } }).version?.sha256;\n if (typeof sha === 'string') this.pool.versioned(sha);\n }\n // None for an own echo or an unknown kind; one per fact otherwise.\n for (const event of auditRowToEvents(row, this.sessionId)) {\n // Absorb before publish: a listener reading the manifest in its\n // callback must see post-mutation state (same order as local).\n this.absorbRemoteEvent(event);\n this.hub.publish(event);\n }\n },\n onFullRefresh: () => {\n // Too far behind to replay: drop the cache; the next read refetches.\n this.manifestCache = null;\n this.inflightManifest = null;\n // Tell subscribers their event-derived state may be stale — the\n // gap's mutations will never arrive as events.\n this.hub.publish({ type: 'stream.desynced', reason: 'backlog-overflow', ts: Date.now() });\n },\n onAuthLost: () => {\n // The stream is gone for good under this credential. Local events\n // keep flowing; remote delivery resumes if the doc is re-opened\n // with a fresh token.\n this.sseClient = null;\n },\n onSession: (status) => this.pool.sync(status),\n onConnected: (connected) => this.pool.connected(connected),\n });\n this.sseClient.open();\n }\n\n private releaseRemoteStream(): void {\n this.sseSubscribers = Math.max(0, this.sseSubscribers - 1);\n if (this.sseSubscribers === 0 && this.sseClient) {\n this.sseClient.close();\n this.sseClient = null;\n }\n }\n\n /** Patch the cached manifest from a remote event's coherence pins — the\n * same absorb rails local mutations use, so reads stay warm no matter\n * whose hand caused the change. */\n private absorbRemoteEvent(event: DocumentEvent): void {\n switch (event.type) {\n case 'pages.scaleSet':\n this.absorbMutation(event.meta, []);\n return;\n case 'annotations.created':\n case 'annotations.updated':\n case 'annotations.deleted':\n case 'annotations.reordered':\n this.absorbMutation(event.meta, ['annotations']);\n return;\n case 'pages.reordered':\n case 'pages.rotated':\n case 'pages.named':\n this.absorbMutation(event.meta, ['layout']);\n return;\n case 'pages.deleted':\n this.absorbPageDelete(event.meta, event.pages);\n return;\n case 'pages.inserted':\n this.absorbPageInsert(event.meta);\n return;\n case 'metadata.updated':\n case 'metadata.customUpdated':\n this.absorbMutation(event.meta, ['metadata']);\n return;\n case 'attachments.created':\n case 'attachments.deleted':\n this.absorbMutation(event.meta, ['attachments']);\n return;\n case 'forms.valueSet':\n case 'forms.repaired':\n case 'forms.created':\n case 'forms.updated':\n case 'forms.deleted':\n case 'forms.restored':\n case 'forms.widgetAdded':\n case 'forms.widgetRemoved':\n case 'forms.widgetUpdated':\n case 'forms.widgetDeleted':\n case 'forms.widgetRestored':\n case 'forms.widgetsReordered':\n case 'forms.calculationsReordered':\n // Form writes move the form's pins: the affected pages are the\n // ones whose widgets changed.\n this.absorbMutation(event.meta, ['forms']);\n return;\n case 'pages.flattened':\n case 'annotations.flattened':\n // Flatten bakes annotations and form fields into page content.\n this.absorbMutation(event.meta, ['content', 'annotations', 'forms']);\n return;\n case 'signatures.prepared':\n case 'document.versioned':\n // Prepare moved the layer's version and working flag; a completion\n // published a new base. Neither ships a delta: refetch the manifest.\n this.manifestCache = null;\n this.inflightManifest = null;\n return;\n case 'redaction.applied':\n // Redaction-apply rewrites content and consumes the marks: every\n // page plane flips — and this is the security-relevant divergence,\n // so a remote apply must stop this client's base reads immediately.\n this.absorbMutation(event.meta, ['content', 'annotations', 'forms']);\n return;\n }\n }\n}\n\nfunction fallbackUnknownHead(id: string): DocumentHead {\n return {\n id,\n baseSha: '',\n storageSizeBytes: 0,\n docVersion: 1,\n state: 'ready',\n encryption: { state: 'unknown', requiresPassword: null },\n permissions: {\n known: false,\n bits: null,\n allAllowed: null,\n openedAs: null,\n securityHandlerRevision: null,\n canUpgradeToOwner: false,\n },\n access: {\n required: true,\n reasons: ['permissions-unknown'],\n endpoint: wirePaths.access(id, DEFAULT_LAYER_NAME),\n },\n };\n}\n","import { EngineError, EngineErrorCode } from '@embedpdf/engine-core/runtime';\n\n/**\n * Share-session exchange: the client half of the no-backend embed flow.\n *\n * A share token (`shr_…`) is a reference to a stored grant on the\n * server, not a credential — `exchangeShareToken` trades it for an\n * ordinary short-lived doc JWT, and `shareSessionSource` wraps that in\n * a self-renewing token source. Because the engine's transport\n * invokes its token source on every request (and SSE reconnects call\n * it again), renewal is nothing more than \"exchange again when the\n * cached session is nearly out\" — no timers, no listeners.\n *\n * The endpoint requires a browser `Origin` header (the server checks\n * it against the grant's allowlist). Browsers attach it automatically;\n * non-browser callers (tests, SSR) must supply a `fetch` that does.\n */\n\nexport interface ShareSession {\n /** Doc-scoped session JWT carrying the grant's capabilities. */\n token: string;\n docId: string;\n layerName: string;\n /** Unix seconds when `token` expires. */\n expiresAt: number;\n}\n\nexport interface ShareExchangeOptions {\n /** Passphrase for protected grants (`SharePasswordRequired` otherwise). */\n password?: string;\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * Thrown on a non-OK exchange. `code` is the server's wire code:\n * `SharePasswordRequired` (prompt and retry with a password),\n * `OriginNotAllowed` / `OriginRequired`, `ShareExpired`, `NotFound`\n * (unknown or revoked — indistinguishable by design), or\n * `TooManyRequests`.\n */\nexport class ShareExchangeError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly status: number,\n ) {\n super(message);\n this.name = 'ShareExchangeError';\n }\n}\n\nexport async function exchangeShareToken(\n baseUrl: string,\n shareToken: string,\n opts: ShareExchangeOptions = {},\n): Promise<ShareSession> {\n const doFetch = opts.fetch ?? globalThis.fetch;\n const res = await doFetch(`${baseUrl.replace(/\\/$/, '')}/v1/share-sessions`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n shareToken,\n ...(opts.password !== undefined ? { password: opts.password } : {}),\n }),\n });\n if (!res.ok) {\n let code = 'Unknown';\n let message = `share exchange failed with status ${res.status}`;\n try {\n const payload = (await res.json()) as { error?: { code?: string; message?: string } };\n if (payload.error?.code) code = payload.error.code;\n if (payload.error?.message) message = payload.error.message;\n } catch {\n // Non-JSON error body; keep the status-shaped message.\n }\n throw new ShareExchangeError(code, message, res.status);\n }\n return (await res.json()) as ShareSession;\n}\n\n/**\n * Lift a {@link ShareExchangeError} into the engine's error taxonomy, so\n * `open({ kind: 'share' })` and every later renewal fail with the same\n * `EngineError` family as all other engine calls. The wire code and HTTP\n * status survive in `details`; the original error rides as `cause`.\n *\n * `SharePasswordRequired` gets its own engine code — it is the one outcome\n * callers branch on programmatically (prompt for the grant passphrase and\n * retry). Everything else maps by meaning, with the HTTP status as the\n * fallback discriminator.\n */\nexport function engineErrorFromShareExchange(error: ShareExchangeError): EngineError {\n const code =\n error.code === 'SharePasswordRequired'\n ? EngineErrorCode.SharePasswordRequired\n : error.code === 'NotFound'\n ? EngineErrorCode.NotFound\n : error.code === 'ShareExpired' ||\n error.code === 'OriginNotAllowed' ||\n error.code === 'OriginRequired'\n ? EngineErrorCode.Forbidden\n : error.status === 401\n ? EngineErrorCode.Unauthenticated\n : error.status === 400\n ? EngineErrorCode.InvalidArg\n : EngineErrorCode.Unknown;\n return new EngineError(code, `share exchange failed: ${error.message}`, {\n details: { shareCode: error.code, status: error.status },\n cause: error,\n });\n}\n\n/** Renew this many seconds before `expiresAt` so in-flight requests never race expiry. */\nconst RENEW_MARGIN_SECONDS = 60;\n\n/**\n * A caching, self-renewing token source over the exchange — the callable\n * member of the engine's `TokenSource` union, assignable wherever one is\n * taken.\n * Concurrent callers share one in-flight exchange; a failed exchange\n * clears it so the next request retries rather than caching the error.\n */\nexport function shareSessionSource(\n baseUrl: string,\n shareToken: string,\n opts: ShareExchangeOptions = {},\n): () => Promise<string> {\n let session: ShareSession | null = null;\n let inflight: Promise<string> | null = null;\n return async () => {\n if (session && session.expiresAt - Date.now() / 1000 > RENEW_MARGIN_SECONDS) {\n return session.token;\n }\n inflight ??= exchangeShareToken(baseUrl, shareToken, opts)\n .then((next) => {\n session = next;\n return next.token;\n })\n .finally(() => {\n inflight = null;\n });\n return inflight;\n };\n}\n","import {\n AbortError,\n EngineError,\n EngineErrorCode,\n parseObjectNumberRanges,\n type ObjectNumberRange,\n type SerializedEngineError,\n type TokenSource,\n} from '@embedpdf/engine-core/runtime';\nimport {\n applyCdnAccess,\n EngineErrorPayloadSchema,\n type CdnAccessInfoForApply,\n} from '@embedpdf/engine-core/wire';\n\n/** CloudPDF SaaS: where an engine connects when it names no server of its own. */\nexport const CLOUDPDF_SAAS_URL = 'https://engine.cloudpdf.com';\n\nexport interface HttpClientOptions {\n /** Where your CloudPDF runs: your own `@cloudpdf/server`, or CloudPDF SaaS\n * ({@link CLOUDPDF_SAAS_URL}) when left out. */\n baseUrl?: string;\n /**\n * Optional bearer token. Either a string or a function that\n * returns a fresh token on every call (so callers can rotate\n * without re-creating the engine). When absent, requests go out\n * without an `Authorization` header — useful for the public-share\n * scenario where the doc-scoped token is provided per-`open` and\n * the engine itself has no engine-level credentials.\n */\n token?: TokenSource;\n /**\n * The open document's session id, sent as `X-Engine-Session-Id` where the\n * server reads it: on writes, `/access`, the event stream and the bulk\n * reservation (see {@link RequestOptions}). The server keeps the editing\n * session's object numbers under it, and stores it on a write's audit\n * row, so the document's own stream can drop its echoes. Each open\n * document has its own (see {@link HttpClient.forDocument}); the engine's\n * client has none.\n */\n sessionId?: string;\n /** Replace the global fetch (e.g. in Node tests with undici). */\n fetch?: typeof globalThis.fetch;\n /**\n * Document affinity key: `X-CloudPDF-Doc` is sent by default on\n * origin-bound doc requests so consistent-hash load balancers can pin\n * a document's traffic to one warm replica. Routing hints are\n * unconditional client behavior — whether they are used is the\n * operator's choice at the load balancer, never the app's. Derived\n * from the request path (`/v1/docs/:docId/…` — the same extraction\n * the Helm chart's uri-mode fallback uses); never sent on\n * CDN-rewritten requests.\n *\n * `false` is an escape hatch, not a feature toggle: use it only\n * against a stale server whose CORS allowlist predates the header\n * (browser preflights would fail) or behind a proxy that rejects\n * unknown request headers.\n */\n docAffinityHeader?: boolean;\n /** Observability: fired once per transport-level retry (engine busy /\n * restarting). Lets apps count sheds without wrapping every call. */\n onRetry?: (info: { path: string; code: string; attempt: number; waitMs: number }) => void;\n}\n\n/**\n * Per-document binding for CDN URL rewriting. `CloudDocumentHandle`\n * calls `setCdnAccess` after `/v1/access` succeeds; the HttpClient\n * then runs every outgoing request through `applyCdnAccess` so\n * granted resources are routed to the CDN with the matching signed\n * query params (or cookies/auth header for the cookie/header\n * adapter modes).\n *\n * Set to `null` when the session is reset or when `/access` was\n * never called (public-share with no CDN configured).\n */\nexport interface CdnBinding {\n readonly cdn: CdnAccessInfoForApply | null;\n readonly docId: string;\n readonly layerName: string;\n}\n\n/**\n * What a write sends beside its request: its `opId` as `Idempotency-Key`,\n * so a retry is answered with what the first try committed, and how many\n * object numbers to top the editing session up by.\n */\nexport interface WriteRequest {\n /** Absent for a request of changes: its body names each change by its own `opId`. */\n readonly opId?: string;\n /** `EmbedPDF-Reserve-Object-Numbers`, when more than 0. */\n readonly reserveObjectNumbers?: number;\n /** Called with the numbers the response hands out (`EmbedPDF-Object-Numbers`). */\n readonly onObjectNumbers?: (ranges: ObjectNumberRange[]) => void;\n}\n\n/** How one request is sent, beyond its path and body. */\nexport interface RequestOptions {\n /**\n * A write: sent as the editing session with its `Idempotency-Key`, and\n * sent again with the same key after a network failure.\n */\n readonly write?: WriteRequest;\n /** Sent as the editing session though not a write: `/access`, the bulk reservation. */\n readonly session?: boolean;\n}\n\n/**\n * A raw-bytes response plus its headers. The attachment-file leaves carry\n * their metadata as headers (`Content-Type`, `X-EmbedPDF-File-Name`), so\n * unlike `getBytes` the caller needs the `Headers` object back.\n */\nexport interface HttpFileResponse {\n bytes: Uint8Array;\n headers: Headers;\n}\n\nexport class HttpClient {\n private readonly base: string;\n private readonly tokenFn: (() => string | Promise<string>) | null;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly docAffinityHeader: boolean;\n private readonly onRetry: HttpClientOptions['onRetry'];\n\n private static readonly MAX_RETRIES = 2;\n private static readonly RETRY_AFTER_CAP_MS = 5_000;\n private static readonly RETRY_AFTER_DEFAULT_MS = 1_000;\n /** A write whose request failed on the network is sent again after these waits. */\n private static readonly NETWORK_RETRY_MS = [250, 1_000, 3_000];\n /** The open document's session id; `null` on the engine's own client. */\n readonly sessionId: string | null;\n private cdnBinding: CdnBinding | null = null;\n\n constructor(private readonly options: HttpClientOptions) {\n this.base = (options.baseUrl ?? CLOUDPDF_SAAS_URL).replace(/\\/$/, '');\n const token = options.token;\n this.tokenFn = token === undefined ? null : typeof token === 'function' ? token : () => token;\n this.sessionId = options.sessionId ?? null;\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.docAffinityHeader = options.docAffinityHeader ?? true;\n this.onRetry = options.onRetry;\n }\n\n /** Normalized server base URL (no trailing slash). */\n get baseUrl(): string {\n return this.base;\n }\n\n /**\n * The fetch implementation this client sends requests through (injected\n * or global). Exposed so sibling transports spawned per-open — the\n * share-session exchange, most of all — ride the same fetch the engine\n * was configured with (test doubles, SSR `Origin`-attaching wrappers).\n */\n get fetchImpl(): typeof globalThis.fetch {\n return this.fetchFn;\n }\n\n /**\n * A client for one open document: this client's settings, the document's\n * own editing session, its own CDN binding, and `token` as its bearer\n * when the open names one (else this client's). Two open documents never\n * share object numbers, event echoes or a CDN binding, even two opens of\n * the same document on one engine.\n */\n forDocument({ sessionId, token }: { sessionId: string; token?: TokenSource }): HttpClient {\n return new HttpClient({\n ...this.options,\n ...(token !== undefined ? { token } : {}),\n sessionId,\n });\n }\n\n /**\n * Raw streaming GET (the SSE channel). Same auth/session headers and\n * error mapping as every other request; the caller owns the body stream.\n */\n async stream(\n path: string,\n headers: Record<string, string>,\n signal: AbortSignal,\n ): Promise<Response> {\n return this.request(\n path,\n { method: 'GET', headers: new Headers({ Accept: 'text/event-stream', ...headers }), signal },\n { session: true },\n );\n }\n\n /**\n * Install (or clear) the per-session CDN binding. Pass `null` to\n * route everything to origin again — useful on session close or\n * when an adapter swap happens mid-session (rare).\n *\n * The HttpClient stays dumb about when to do this; the cloud\n * document handle pushes the binding in after /access succeeds.\n *\n * Side effect: in the browser, signedCookies are written to\n * `document.cookie` once per setCdnAccess call so the CDN edge\n * receives them on subsequent fetches. Outside the browser signed\n * cookies are ignored: this client keeps no cookie jar.\n */\n setCdnAccess(binding: CdnBinding | null): void {\n this.cdnBinding = binding;\n if (binding?.cdn?.signedCookies && typeof globalThis.document !== 'undefined') {\n for (const cookie of binding.cdn.signedCookies) {\n const parts = [`${cookie.name}=${cookie.value}`];\n parts.push(`Path=${cookie.path ?? '/'}`);\n if (cookie.domain) parts.push(`Domain=${cookie.domain}`);\n if (cookie.expires) parts.push(`Expires=${new Date(cookie.expires * 1000).toUTCString()}`);\n parts.push('SameSite=None', 'Secure');\n globalThis.document.cookie = parts.join('; ');\n }\n }\n }\n\n /** Current CDN binding (or null). Exposed for diagnostics/tests. */\n get currentCdnBinding(): CdnBinding | null {\n return this.cdnBinding;\n }\n\n absoluteUrl(path: string): string {\n return `${this.baseUrl}${path}`;\n }\n\n async getBlob(path: string, signal: AbortSignal): Promise<Blob> {\n const res = await this.request(path, { method: 'GET', signal });\n if (!res.ok) await this.throwFromBody(res);\n return await res.blob();\n }\n\n async getBytes(path: string, signal: AbortSignal): Promise<Uint8Array> {\n const res = await this.request(path, {\n method: 'GET',\n headers: new Headers({ Accept: 'application/pdf' }),\n signal,\n });\n if (!res.ok) await this.throwFromBody(res);\n return new Uint8Array(await res.arrayBuffer());\n }\n\n /**\n * Resolve the current bearer token. Awaits the user-supplied\n * token factory if it returns a promise. Used by the cloud\n * engine to read doc-scoped claims **without** verifying — the\n * server is the verifier of record. Throws when no token is\n * configured.\n */\n async currentToken(): Promise<string> {\n if (!this.tokenFn) {\n throw new EngineError(EngineErrorCode.InvalidArg, 'http client has no token configured');\n }\n return await this.tokenFn();\n }\n\n async getJson<T>(path: string, parser: (raw: unknown) => T, signal: AbortSignal): Promise<T> {\n const res = await this.request(path, { method: 'GET', signal });\n return await this.parseJsonResponse(res, parser);\n }\n\n /**\n * GET a versioned URL with transparent stale-version recovery. If\n * the server returns 404 (the well-known \"this version is gone\"\n * signal for content-addressed reads), call `onStaleVersion` (which\n * the caller wires to a manifest refresh), then re-resolve `buildPath`\n * and retry the GET exactly once. Any non-404 error propagates.\n *\n * The retry budget is hard-capped at 1: after a refresh, if the\n * server's idea of the current version is still ahead of the\n * client's view, the second request fails normally — this matches\n * the CDN cache invariant (\"a versioned URL's bytes are immutable\n * for its lifetime\").\n */\n async getJsonWithRefresh<T>(\n buildPath: (signal: AbortSignal) => Promise<string>,\n parser: (raw: unknown) => T,\n onStaleVersion: (signal: AbortSignal) => Promise<void>,\n signal: AbortSignal,\n ): Promise<T> {\n const initialPath = await buildPath(signal);\n try {\n return await this.getJson(initialPath, parser, signal);\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n await onStaleVersion(signal);\n const retryPath = await buildPath(signal);\n return await this.getJson(retryPath, parser, signal);\n }\n }\n\n /**\n * GET a `multipart/form-data` body and parse it with the platform's\n * `Response.formData()` (works in browsers and undici). Text parts come\n * back as strings, parts with a filename as `Blob`s.\n */\n async getFormData(path: string, signal: AbortSignal): Promise<FormData> {\n const res = await this.request(path, {\n method: 'GET',\n headers: new Headers({ Accept: 'multipart/form-data' }),\n signal,\n });\n if (!res.ok) await this.throwFromBody(res);\n return await res.formData();\n }\n\n /**\n * `getFormData` with the same single-retry stale-version recovery as\n * {@link getJsonWithRefresh}: a 404 on a versioned URL triggers\n * `onStaleVersion` (a manifest refresh) and one re-resolve + retry.\n */\n async getFormDataWithRefresh(\n buildPath: (signal: AbortSignal) => Promise<string>,\n onStaleVersion: (signal: AbortSignal) => Promise<void>,\n signal: AbortSignal,\n ): Promise<FormData> {\n const initialPath = await buildPath(signal);\n try {\n return await this.getFormData(initialPath, signal);\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n await onStaleVersion(signal);\n const retryPath = await buildPath(signal);\n return await this.getFormData(retryPath, signal);\n }\n }\n\n /**\n * `getBlob` with the same single-retry stale-version recovery as\n * {@link getJsonWithRefresh}: a 404 on a versioned URL triggers\n * `onStaleVersion` (a manifest refresh) and one re-resolve + retry.\n * Render blobs ride this rail: a scope flip re-resolves the\n * doc-vs-layer path family instead of failing on a stale URL.\n */\n async getBlobWithRefresh(\n buildPath: (signal: AbortSignal) => Promise<string>,\n onStaleVersion: (signal: AbortSignal) => Promise<void>,\n signal: AbortSignal,\n ): Promise<Blob> {\n const initialPath = await buildPath(signal);\n try {\n return await this.getBlob(initialPath, signal);\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n await onStaleVersion(signal);\n const retryPath = await buildPath(signal);\n return await this.getBlob(retryPath, signal);\n }\n }\n\n /** GET raw bytes plus the response headers (attachment-file leaves). */\n async getFile(path: string, signal: AbortSignal): Promise<HttpFileResponse> {\n const res = await this.request(path, { method: 'GET', signal });\n if (!res.ok) await this.throwFromBody(res);\n return { bytes: new Uint8Array(await res.arrayBuffer()), headers: res.headers };\n }\n\n /**\n * `getFile` with the same single-retry stale-version recovery as\n * {@link getJsonWithRefresh}: a 404 on a versioned URL triggers\n * `onStaleVersion` (a manifest refresh) and one re-resolve + retry.\n */\n async getFileWithRefresh(\n buildPath: (signal: AbortSignal) => Promise<string>,\n onStaleVersion: (signal: AbortSignal) => Promise<void>,\n signal: AbortSignal,\n ): Promise<HttpFileResponse> {\n const initialPath = await buildPath(signal);\n try {\n return await this.getFile(initialPath, signal);\n } catch (err) {\n if (!EngineError.is(err, EngineErrorCode.NotFound)) throw err;\n await onStaleVersion(signal);\n const retryPath = await buildPath(signal);\n return await this.getFile(retryPath, signal);\n }\n }\n\n async postMultipartJson<T>(\n path: string,\n body: FormData,\n parser: (raw: unknown) => T,\n signal: AbortSignal,\n options: RequestOptions = {},\n ): Promise<T> {\n const res = await this.request(path, { method: 'POST', body, signal }, options);\n return await this.parseJsonResponse(res, parser);\n }\n\n /** PATCH counterpart of {@link postMultipartJson} (binary-carrying mutations). */\n async patchMultipartJson<T>(\n path: string,\n body: FormData,\n parser: (raw: unknown) => T,\n signal: AbortSignal,\n options: RequestOptions = {},\n ): Promise<T> {\n const res = await this.request(path, { method: 'PATCH', body, signal }, options);\n return await this.parseJsonResponse(res, parser);\n }\n\n async postJson<T>(\n path: string,\n body: unknown,\n parser: (raw: unknown) => T,\n signal: AbortSignal,\n options: RequestOptions = {},\n ): Promise<T> {\n const res = await this.requestJson(path, 'POST', body, signal, options);\n return await this.parseJsonResponse(res, parser);\n }\n\n async putJson<T>(\n path: string,\n body: unknown,\n parser: (raw: unknown) => T,\n signal: AbortSignal,\n options: RequestOptions = {},\n ): Promise<T> {\n return this.parseJsonResponse(\n await this.requestJson(path, 'PUT', body, signal, options),\n parser,\n );\n }\n\n /** POST a JSON body and parse a `multipart/form-data` response (a large annotation export). */\n async postJsonFormData(path: string, body: unknown, signal: AbortSignal): Promise<FormData> {\n const res = await this.request(path, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: new Headers({\n 'Content-Type': 'application/json',\n Accept: 'multipart/form-data',\n }),\n signal,\n });\n if (!res.ok) await this.throwFromBody(res);\n return await res.formData();\n }\n\n /** POST a JSON body and return the raw binary response (pages.extract). */\n async postJsonBytes(path: string, body: unknown, signal: AbortSignal): Promise<Uint8Array> {\n const res = await this.requestJson(path, 'POST', body, signal);\n if (!res.ok) await this.throwFromBody(res);\n return new Uint8Array(await res.arrayBuffer());\n }\n\n /** POST a raw binary body (FDF/XFDF import) and parse the JSON response. */\n async postBytesJson<T>(\n path: string,\n bytes: Uint8Array,\n contentType: string,\n parser: (raw: unknown) => T,\n signal: AbortSignal,\n options: RequestOptions = {},\n ): Promise<T> {\n const headers = new Headers({ 'Content-Type': contentType });\n // Copy into a fresh ArrayBuffer: `bytes` may be a view over a larger\n // (or SharedArrayBuffer-backed) buffer, which fetch bodies reject.\n const body = new Uint8Array(bytes).buffer as ArrayBuffer;\n const res = await this.request(path, { method: 'POST', body, headers, signal }, options);\n return await this.parseJsonResponse(res, parser);\n }\n\n async patchJson<T>(\n path: string,\n body: unknown,\n parser: (raw: unknown) => T,\n signal: AbortSignal,\n options: RequestOptions = {},\n ): Promise<T> {\n const res = await this.requestJson(path, 'PATCH', body, signal, options);\n return await this.parseJsonResponse(res, parser);\n }\n\n async deleteJson<T>(\n path: string,\n parser: (raw: unknown) => T,\n signal: AbortSignal,\n options: RequestOptions = {},\n ): Promise<T> {\n const res = await this.request(path, { method: 'DELETE', signal }, options);\n return await this.parseJsonResponse(res, parser);\n }\n\n private requestJson(\n path: string,\n method: 'POST' | 'PATCH' | 'PUT',\n body: unknown,\n signal: AbortSignal,\n options: RequestOptions = {},\n ): Promise<Response> {\n const headers = new Headers({ 'Content-Type': 'application/json' });\n return this.request(\n path,\n { method, body: JSON.stringify(body ?? {}), headers, signal },\n options,\n );\n }\n\n private async request(\n path: string,\n init: RequestInit,\n options: RequestOptions = {},\n ): Promise<Response> {\n const { url, extraHeader, routedToCdn } = this.resolveOutgoing(path, init.method ?? 'GET');\n const headers = new Headers(init.headers ?? {});\n if (this.tokenFn) {\n const token = await this.tokenFn();\n headers.set('Authorization', `Bearer ${token}`);\n }\n if (!headers.has('Accept')) headers.set('Accept', 'application/json');\n // The session header only where the server reads it: on any other read\n // it would turn a plain CDN request into one that needs a preflight.\n const { write } = options;\n if (this.sessionId && (write || options.session)) {\n headers.set('X-Engine-Session-Id', this.sessionId);\n }\n if (write) {\n if (write.opId !== undefined) headers.set('Idempotency-Key', write.opId);\n if (write.reserveObjectNumbers && write.reserveObjectNumbers > 0) {\n headers.set('EmbedPDF-Reserve-Object-Numbers', String(write.reserveObjectNumbers));\n }\n }\n if (extraHeader) headers.set(extraHeader.name, extraHeader.value);\n // Document affinity key: origin-bound doc requests only (a CDN GET is a\n // \"simple\" request today — a custom header would create preflights\n // for zero routing value). Same extraction as the chart's uri-mode\n // regex, so the header tier and the ingress fallback cannot disagree.\n if (this.docAffinityHeader && !routedToCdn) {\n const doc = /^\\/v1\\/docs\\/([^/]+)\\//.exec(path);\n if (doc) headers.set('X-CloudPDF-Doc', decodeURIComponent(doc[1]!));\n }\n // Code-keyed backpressure retry: Only our own 503s (`EngineBusy` =\n // shed before dispatch, `EngineRestarting` = the apply never landed)\n // — both mean nothing happened, so retrying is method-agnostic-safe,\n // mutations included. A foreign 503 is returned without a retry.\n for (let attempt = 0, networkFailures = 0; ; attempt++) {\n let res: Response;\n try {\n res = await this.execute(url, { ...init, headers });\n } catch (err) {\n // A write that may or may not have landed goes again under the same\n // key: the server answers a repeat with what the first one committed.\n const wait = HttpClient.NETWORK_RETRY_MS[networkFailures];\n if (\n !write ||\n wait === undefined ||\n !EngineError.is(err, EngineErrorCode.Network) ||\n isStreamBody(init.body ?? null)\n ) {\n throw err;\n }\n networkFailures++;\n const waitMs = wait * (0.9 + 0.2 * Math.random());\n this.onRetry?.({ path, code: EngineErrorCode.Network, attempt, waitMs });\n await sleepRacingAbort(waitMs, init.signal ?? null);\n continue;\n }\n if (res.ok && write?.onObjectNumbers) {\n const ranges = parseObjectNumberRanges(res.headers.get('EmbedPDF-Object-Numbers'));\n if (ranges.length > 0) write.onObjectNumbers(ranges);\n }\n if (\n res.status !== 503 ||\n attempt >= HttpClient.MAX_RETRIES ||\n isStreamBody(init.body ?? null)\n ) {\n return res;\n }\n const code = await peekErrorCode(res);\n if (code === null || !RETRYABLE_503.has(code)) return res;\n const hinted = Number(res.headers.get('retry-after'));\n const base = Number.isFinite(hinted)\n ? Math.min(Math.max(hinted, 0) * 1000, HttpClient.RETRY_AFTER_CAP_MS)\n : HttpClient.RETRY_AFTER_DEFAULT_MS;\n const waitMs = base * (0.9 + 0.2 * Math.random());\n this.onRetry?.({ path, code, attempt, waitMs });\n await sleepRacingAbort(waitMs, init.signal ?? null);\n }\n }\n\n private async execute(url: string, init: RequestInit): Promise<Response> {\n try {\n return await this.fetchFn(url, init);\n } catch (err) {\n // undici's fetch propagates whatever was passed to AbortController.abort().\n // Anything that arrives while signal.aborted is true is an abort, regardless\n // of the wire-shape (DOMException, plain Error, string, ...).\n if (init.signal?.aborted) {\n throw new AbortError(init.signal.reason ?? err);\n }\n if ((err as { name?: string } | null)?.name === 'AbortError') {\n throw new AbortError((err as Error).message);\n }\n throw new EngineError(\n EngineErrorCode.Network,\n `network error: ${(err as Error)?.message ?? err}`,\n {\n cause: err,\n },\n );\n }\n }\n\n private async parseJsonResponse<T>(res: Response, parser: (raw: unknown) => T): Promise<T> {\n if (!res.ok) await this.throwFromBody(res);\n const json: unknown = await res.json().catch(() => ({}));\n try {\n return parser(json);\n } catch (err) {\n throw new EngineError(\n EngineErrorCode.WireFormat,\n `unexpected response shape: ${(err as Error)?.message ?? err}`,\n {\n cause: err,\n },\n );\n }\n }\n\n /**\n * Decide where this request actually goes. With no CDN binding (or\n * binding's `cdn` is null) every request stays on origin, and so does\n * every request that isn't a read (`GET`, `HEAD`): a write must reach the\n * server itself, whatever read its path looks like. Otherwise\n * `applyCdnAccess` decides per-request based on the resource the\n * path resolves to (and whether the caller's scope granted CDN\n * access to it).\n */\n private resolveOutgoing(\n path: string,\n method: string,\n ): {\n url: string;\n extraHeader: { name: string; value: string } | null;\n routedToCdn: boolean;\n } {\n const read = method === 'GET' || method === 'HEAD';\n if (!read || !this.cdnBinding || !this.cdnBinding.cdn) {\n return { url: `${this.baseUrl}${path}`, extraHeader: null, routedToCdn: false };\n }\n const applied = applyCdnAccess({\n path,\n originUrl: this.baseUrl,\n docId: this.cdnBinding.docId,\n layerName: this.cdnBinding.layerName,\n cdn: this.cdnBinding.cdn,\n });\n return {\n url: applied.url,\n extraHeader: applied.routedToCdn && applied.authHeader ? applied.authHeader : null,\n routedToCdn: applied.routedToCdn,\n };\n }\n\n private async throwFromBody(res: Response): Promise<never> {\n let payload: unknown;\n try {\n payload = await res.json();\n } catch {\n payload = null;\n }\n const code = mapStatusToCode(res.status);\n if (payload && typeof payload === 'object' && 'error' in payload) {\n const inner = (payload as { error: unknown }).error;\n const parsed = trySerialized(inner);\n if (parsed) throw new EngineError(parsed.code, parsed.message, { details: parsed.details });\n const msg =\n typeof inner === 'object' && inner && 'message' in inner\n ? String((inner as { message: unknown }).message)\n : `HTTP ${res.status}`;\n throw new EngineError(code, msg, { details: { status: res.status } });\n }\n throw new EngineError(code, `HTTP ${res.status}`, { details: { status: res.status } });\n }\n}\n\nfunction mapStatusToCode(status: number): EngineErrorCode {\n if (status === 401) return EngineErrorCode.Unauthenticated;\n if (status === 403) return EngineErrorCode.Forbidden;\n // A conflict whose body names no code: the layer moved under the write.\n if (status === 409) return EngineErrorCode.LayerVersionConflict;\n if (status === 404) return EngineErrorCode.NotFound;\n // A request body past the server's limit, refused before any route runs.\n if (status === 413) return EngineErrorCode.PayloadTooLarge;\n if (status === 422) return EngineErrorCode.DocOpenFailed;\n if (status === 499) return EngineErrorCode.Aborted;\n if (status === 400) return EngineErrorCode.InvalidArg;\n return EngineErrorCode.Unknown;\n}\n\nfunction trySerialized(value: unknown): SerializedEngineError | null {\n const result = EngineErrorPayloadSchema.safeParse(value);\n return result.success ? result.data : null;\n}\n\nconst RETRYABLE_503 = new Set(['EngineBusy', 'EngineRestarting']);\n\nfunction isStreamBody(body: BodyInit | null): boolean {\n return typeof ReadableStream !== 'undefined' && body instanceof ReadableStream;\n}\n\n/** Read the error code from a 503 body without consuming the response. */\nasync function peekErrorCode(res: Response): Promise<string | null> {\n try {\n const payload = (await res.clone().json()) as { error?: { code?: unknown } } | null;\n const code = payload?.error?.code;\n return typeof code === 'string' ? code : null;\n } catch {\n return null;\n }\n}\n\nfunction sleepRacingAbort(ms: number, signal: AbortSignal | null): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new AbortError(signal.reason ?? 'aborted'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n reject(new AbortError(signal?.reason ?? 'aborted'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n","import {\n AbortablePromise,\n EngineError,\n EngineErrorCode,\n generateUuid,\n type DocumentHandle,\n type Engine,\n type OpenInput,\n type OpenOptions,\n} from '@embedpdf/engine-core/runtime';\nimport {\n DEFAULT_LAYER_NAME,\n DocumentHeadSchema,\n wirePaths,\n type DocumentHead,\n} from '@embedpdf/engine-core/wire';\n\nimport { CloudDocumentHandle } from './document/CloudDocumentHandle';\nimport { CloudDocumentSecurityService } from './document/CloudDocumentSecurityService';\nimport { engineErrorFromShareExchange, ShareExchangeError, shareSessionSource } from './share';\nimport { decodeUnverifiedClaims } from './transport/decodeUnverifiedClaims';\nimport { HttpClient, type HttpClientOptions } from './transport/HttpClient';\n\n/**\n * `cloudEngine()`'s options: the HTTP client's, minus the session id, which\n * the engine mints for each document it opens.\n */\nexport interface CloudEngineOptions extends Omit<HttpClientOptions, 'sessionId'> {}\n\n/**\n * Cloud engine: speaks the same Engine interface as @embedpdf/engine\n * but routes everything through HTTPS to a remote @cloudpdf/server (or\n * CloudPDF SaaS). Identical observable contract; only the transport differs.\n */\nexport class CloudEngine implements Engine {\n static fromOptions(opts: CloudEngineOptions): CloudEngine {\n return new CloudEngine(new HttpClient(opts));\n }\n\n /** It opens the documents your server holds, never a file's bytes. */\n readonly canOpenFiles = false;\n private destroyed = false;\n /** The documents this engine opened and nobody closed yet. */\n private readonly handles = new Set<CloudDocumentHandle>();\n\n private constructor(private readonly http: HttpClient) {}\n\n open(input: OpenInput, options?: OpenOptions): AbortablePromise<DocumentHandle> {\n if (this.destroyed) {\n return AbortablePromise.rejectReason(\n new EngineError(EngineErrorCode.RuntimeUnavailable, 'engine destroyed'),\n );\n }\n // Cloud reads scope + identity from the doc-scoped JWT — `options.scope`\n // and `options.identity` are engine-local concepts and are intentionally\n // ignored here. Same `OpenOptions` type for both engines is what makes\n // SDK code portable; the JWT is the authority cloud-side.\n void options?.scope;\n void options?.identity;\n\n // The PDF's own password is an open option for every input kind, as on\n // the local engine. A share's passphrase is `input.sharePassword`.\n const effectivePassword = options?.password ?? null;\n\n if (input.kind === 'share') {\n // Open by public share token: exchange `shr_…` for a short-lived\n // doc-scoped session JWT, then delegate to the 'token' arm — the\n // handle binds to a self-renewing source, so revoking or editing\n // the share retargets this open at the next renewal. The exchange\n // rides the engine's own transport config (baseUrl + fetch);\n // exchange failures surface as EngineErrors on open and on every\n // later renewal (RPCs, SSE reconnects), never as raw\n // ShareExchangeErrors.\n const raw = shareSessionSource(this.http.baseUrl, input.shareToken, {\n ...(input.sharePassword !== undefined ? { password: input.sharePassword } : {}),\n fetch: this.http.fetchImpl,\n });\n const token = async () => {\n try {\n return await raw();\n } catch (error) {\n throw error instanceof ShareExchangeError ? engineErrorFromShareExchange(error) : error;\n }\n };\n return this.open({ kind: 'token', token }, options);\n }\n\n if (input.kind === 'token') {\n // Open by doc-scoped JWT. We never verify the token SDK-side\n // (server is the verifier of record); we just decode the\n // unsigned payload to learn `doc_id`, then route to /head with\n // the per-open bearer. The resulting handle owns its own\n // scoped HttpClient — every subsequent RPC carries this\n // token, not the engine-level one, so one engine can hold\n // many handles each with a different bearer.\n const tokenSource = input.token;\n return AbortablePromise.run<DocumentHandle>(async (signal) => {\n const docHttp = this.http.forDocument({ sessionId: newSessionId(), token: tokenSource });\n const token = await docHttp.currentToken();\n const claims = decodeUnverifiedClaims(token);\n const docId = claims.doc_id;\n if (typeof docId !== 'string' || docId.length === 0) {\n throw new EngineError(\n EngineErrorCode.InvalidArg,\n 'cloud engine: token has no doc_id claim — mint a doc-scoped JWT',\n );\n }\n const layerName =\n typeof claims.layer_name === 'string' && claims.layer_name.length > 0\n ? claims.layer_name\n : DEFAULT_LAYER_NAME;\n const head = await docHttp.getJson(\n wirePaths.layerHead(docId, layerName),\n (raw) => DocumentHeadSchema.parse(raw),\n signal,\n );\n const handle = new CloudDocumentHandle(\n docHttp,\n head.id,\n layerName,\n head,\n token,\n () => this.handles.delete(handle),\n );\n this.handles.add(handle);\n try {\n await establishOnOpen(handle, head, signal, effectivePassword, false);\n } catch (error) {\n await handle.close();\n throw error;\n }\n return handle;\n });\n }\n\n if (input.kind === 'id') {\n // Open by docId using the engine-level token (typical: a\n // tenant JWT). The caller can override per-open by setting\n // `input.token`; the resulting handle then carries that\n // override for all of its RPCs.\n const id = input.id;\n const docHttp = this.http.forDocument({\n sessionId: newSessionId(),\n ...(input.token ? { token: input.token } : {}),\n });\n return AbortablePromise.run<DocumentHandle>(async (signal) => {\n let layerName = input.layerName ?? DEFAULT_LAYER_NAME;\n // Resolve the bearer once so we have it for the layer-name\n // claim and for the security service's local-fallback scope/\n // identity. May be null when the engine has no token at all\n // (caller invokes /head anonymously — server will reject).\n let resolvedToken: string | null = null;\n try {\n resolvedToken = await docHttp.currentToken();\n } catch {\n resolvedToken = null;\n }\n if (!input.layerName && resolvedToken) {\n const claims = decodeUnverifiedClaims(resolvedToken);\n if (typeof claims.layer_name === 'string' && claims.layer_name.length > 0) {\n layerName = claims.layer_name;\n }\n }\n const head = await docHttp.getJson(\n wirePaths.layerHead(id, layerName),\n (raw) => DocumentHeadSchema.parse(raw),\n signal,\n );\n const handle = new CloudDocumentHandle(\n docHttp,\n head.id,\n layerName,\n head,\n resolvedToken,\n () => this.handles.delete(handle),\n );\n this.handles.add(handle);\n // A token naming no document is a tenant's, which owns its documents.\n const tenant =\n resolvedToken !== null &&\n typeof decodeUnverifiedClaims(resolvedToken).doc_id !== 'string';\n try {\n await establishOnOpen(handle, head, signal, effectivePassword, tenant);\n } catch (error) {\n await handle.close();\n throw error;\n }\n return handle;\n });\n }\n\n void options;\n return AbortablePromise.rejectReason(\n new EngineError(\n EngineErrorCode.InvalidArg,\n `cloud engine supports OpenInput.kind === 'token', 'id', or 'share' (got '${(input as { kind?: string }).kind}')`,\n ),\n );\n }\n\n /**\n * Close every document this engine opened (their event streams stop), then\n * refuse new opens. As on the local engine, a handle is unusable after.\n */\n destroy(): AbortablePromise<void> {\n if (this.destroyed) return AbortablePromise.resolveValue<void>(undefined);\n this.destroyed = true;\n const open = [...this.handles];\n this.handles.clear();\n return AbortablePromise.run<void>(async () => {\n await Promise.all(open.map((handle) => handle.close()));\n });\n }\n}\n\n/**\n * A session id for a document being opened. Every open is its own session,\n * even a second open of the same document on this engine. The id stamps the\n * document's own events' origins and travels as `X-Engine-Session-Id`: the\n * server keeps the session's object numbers under it and marks its audit\n * rows with it, so the document's stream drops its own echoes and hears\n * every other open as remote.\n */\nfunction newSessionId(): string {\n return `cloud:${generateUuid()}`;\n}\n\n/**\n * What `open()` learns before handing the document over: access when the\n * password or a CDN needs it (see {@link maybeAutoEstablishAccess}), then\n * what the document's signatures forbid (the manifest). A caller that may\n * create objects calls `/access` anyway, beside the manifest fetch, for its\n * editing session's first object numbers; on a document locked by a\n * password, `unlock()` brings them. A failed `/access` doesn't fail the\n * open: creates then go without numbers until the pool gets some.\n */\nasync function establishOnOpen(\n handle: CloudDocumentHandle,\n head: DocumentHead,\n signal: AbortSignal,\n password: string | null,\n tenant: boolean,\n): Promise<void> {\n const accessed = await maybeAutoEstablishAccess(handle, head, signal, password);\n const security = handle.security as CloudDocumentSecurityService;\n const locked = !accessed && head.access.reasons.includes('password');\n await Promise.all([\n !accessed && !locked && (tenant || mayCreateObjects(security))\n ? settleLinked(security.establishAccess(), signal)\n : undefined,\n handle.learnProtection(signal),\n ]);\n}\n\n/**\n * Whether the caller may make new objects (annotations as itself, pages,\n * form fields): the server's own test for handing out object numbers, from\n * what the client knows before `/access`.\n */\nfunction mayCreateObjects(security: CloudDocumentSecurityService): boolean {\n return (\n security.allowsAnnotation('create') ||\n security.allows('doc.pages.assemble') ||\n security.allows('doc.forms.modify')\n );\n}\n\n/**\n * Post-/head access establishment, in two layers:\n *\n * 1. **Supplied password** — a password given at open is always tried\n * (PDFium parity: the local engine feeds it to the loader no matter\n * what). Two triggers, because `/head` only carries the `password`\n * reason when a password is needed to read:\n * - `reasons` has `'password'` → required-to-read case\n * - `head.permissions.canUpgradeToOwner` → permission-only encrypted\n * doc; the password can still upgrade to owner. Skipping this arm\n * would silently drop supplied owner passwords — and diverge from\n * the local engine on identical input.\n * Outcomes follow \"a password failure may only block what the password\n * was needed for\": a rejection in the required case leaves the handle\n * locked (the prompt says `incorrect`, as on the local engine); in the\n * upgrade case the document stays readable and the failure is\n * non-fatal. The one /access POST also installs the CDN binding, so a\n * successful unlock covers the `password + cdn` combined case.\n *\n * 2. **CDN-only** — unchanged: `/access` without a password, transparently.\n * A required password with no supplied password never auto-calls; the\n * dev prompts and `unlock()` runs the same POST.\n *\n * Non-password /access failures never break `open()` (the first real\n * request still tries origin, where the JWT check produces a regular\n * Forbidden) — but they are also never mistaken for a wrong password:\n * only a DocPasswordRequired/Incorrect rejection means \"wrong password\".\n *\n * Returns whether `/access` answered.\n */\nasync function maybeAutoEstablishAccess(\n handle: CloudDocumentHandle,\n head: {\n access: { required: boolean; reasons: ReadonlyArray<string> };\n permissions: { canUpgradeToOwner: boolean };\n },\n signal: AbortSignal,\n password: string | null,\n): Promise<boolean> {\n const reasons = new Set(head.access.reasons);\n // CloudDocumentSecurityService exposes `establishAccess()` — the\n // no-password sibling of `unlock()`. The public DocumentSecurityService\n // interface doesn't carry it (unlock = user action), but every\n // CloudDocumentHandle's `.security` is a CloudDocumentSecurityService.\n const security = handle.security as CloudDocumentSecurityService;\n\n const tryPassword =\n password != null && (reasons.has('password') || head.permissions.canUpgradeToOwner);\n if (tryPassword) {\n const unlocked = await settleLinked(security.unlock({ password, mode: 'any' }), signal);\n if (unlocked) return true; // /access succeeded — CDN binding installed too\n // Rejected or failed: in the required case the handle stays locked and\n // the caller's password prompt takes over (`incorrect` when the password\n // was wrong; retrying re-POSTs /access); in the upgrade case the\n // document is readable regardless — fall through so a CDN-only\n // establishment still happens.\n if (reasons.has('password')) return false;\n }\n\n if (!head.access.required) return false;\n if (reasons.has('password')) return false; // wait for explicit unlock()\n if (!reasons.has('cdn')) return false; // nothing actionable for the SDK\n return settleLinked(security.establishAccess(), signal);\n}\n\n/** Await an /access attempt with open()-abort linkage. Returns whether it\n * succeeded; failures are contained (see maybeAutoEstablishAccess). */\nasync function settleLinked(\n pending: ReturnType<CloudDocumentSecurityService['unlock']>,\n signal: AbortSignal,\n): Promise<boolean> {\n const onAbort = () => pending.abort(signal.reason ?? new Error('aborted'));\n if (signal.aborted) onAbort();\n else signal.addEventListener('abort', onAbort, { once: true });\n try {\n await pending;\n return true;\n } catch {\n return false;\n } finally {\n signal.removeEventListener('abort', onAbort);\n }\n}\n","/**\n * @cloudpdf/engine - the cloud engine client.\n *\n * Implements the same {@link Engine} interface as `@embedpdf/engine` but\n * routes calls to a remote `@cloudpdf/server` over HTTP. Same observable\n * contract: {@link AbortablePromise}-based, EngineError-coded, parity-tested\n * with `runMetadataConformance`.\n */\nexport { CloudEngine } from './CloudEngine';\nexport type { CloudEngineOptions } from './CloudEngine';\nexport { CloudDocumentHandle } from './document/CloudDocumentHandle';\nexport { CloudMetadataService } from './document/CloudMetadataService';\nexport { CloudDocumentAnnotationsService } from './document/CloudDocumentAnnotationsService';\nexport { CloudDocumentPagesService } from './document/CloudDocumentPagesService';\nexport { CloudPageHandle } from './document/CloudPageHandle';\nexport { CloudPageAnnotationsService } from './document/CloudPageAnnotationsService';\nexport { CloudPageRenderService } from './document/CloudPageRenderService';\nexport { CLOUDPDF_SAAS_URL, HttpClient } from './transport/HttpClient';\nexport type { HttpClientOptions } from './transport/HttpClient';\nexport { decodeUnverifiedClaims } from './transport/decodeUnverifiedClaims';\nexport type { UnverifiedClaims } from './transport/decodeUnverifiedClaims';\nexport {\n exchangeShareToken,\n shareSessionSource,\n ShareExchangeError,\n engineErrorFromShareExchange,\n} from './share';\nexport type { ShareSession, ShareExchangeOptions } from './share';\n\nimport { CloudEngine, type CloudEngineOptions } from './CloudEngine';\n\n/**\n * Create a cloud {@link CloudEngine} — the drop-in counterpart of\n * `localEngine()`, so swapping local for cloud is a one-import change.\n *\n * Synchronous and cheap: no WASM to compile, no worker to spawn — the engine\n * holds an HTTP client and nothing else. Like `localEngine()`, the returned\n * instance is yours (call `destroy()` when done, usually never for a\n * module-scope singleton); pass a thunk (`engine={() => cloudEngine(...)}`)\n * to let a `<Viewer>` own the lifetime instead.\n *\n * Note the deliberate asymmetry with `localEngine()`: there is no `fonts`\n * option. Fallback fonts are a server policy on the cloud (`Engine.fonts` is\n * `undefined` cloud-side), so they cannot be configured from the client. This\n * is the local-vs-cloud split, surfaced in the API.\n *\n * Without a `baseUrl` it connects to CloudPDF SaaS; your own server names itself:\n *\n * ```ts\n * const engine = cloudEngine(); // CloudPDF SaaS\n * const own = cloudEngine({ baseUrl: 'https://pdf.example.com' }); // your @cloudpdf/server\n * <Viewer engine={engine} plugins={[stagePlugin(), renderPlugin()]} />\n * ```\n */\nexport function cloudEngine(opts: CloudEngineOptions = {}): CloudEngine {\n return CloudEngine.fromOptions(opts);\n}\n\n// The developer-facing surface both engine packages share: errors, refs,\n// helpers and the document types, from one list in engine-core.\nexport * from '@embedpdf/engine-core/public';\n"],"mappings":"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"}
|