# RichDocumentSession

Source: /tuil/docs/reference/packages/editor/api/rich-document-session
Locale: en

class exported by @mwillbanks/tuil-editor.



{/* Generated by tooling/docs/generate-reference.ts. */}

## class [#class]

Public class exported by `@mwillbanks/tuil-editor`.

```ts
export class RichDocumentSession {
  #document: RichDocument;
  readonly #history: RichDocument[] = [];
  readonly #redo: RichDocument[] = [];
  readonly #providers: ReadonlyMap<string, RichNodeProvider>;

  constructor(
    root: RichNode = { type: "document", children: [] },
    options: RichEditorProviderOptions = {},
  ) {
    this.#providers = richNodeProviderMap(options.nodes);
    const validated = validateRichNode(root, this.#providers);
    if (validated.type !== "document") {
      throw new Error("Rich documents require a document root");
    }
    this.#document = Object.freeze({ version: 0, root: freezeNode(validated) });
  }

  snapshot(): RichDocument {
    return this.#document;
  }

  dispatch(transaction: RichTransaction): RichDocument {
    const node = transaction.node
      ? freezeNode(validateRichNode(transaction.node, this.#providers))
      : undefined;
    const validated = { ...transaction, node };
    if (transaction.path.length === 0 && transaction.node) {
      if (node?.type !== "document") {
        throw new Error("Rich documents require a document root");
      }
      this.#history.push(this.#document);
      this.#redo.length = 0;
      this.#document = Object.freeze({
        version: this.#document.version + 1,
        root: node,
      });
      return this.#document;
    }
    this.#history.push(this.#document);
    this.#redo.length = 0;
    this.#document = Object.freeze({
      version: this.#document.version + 1,
      root: editRichNode(this.#document.root, validated, 0),
    });
    return this.#document;
  }

  undo(): boolean {
    const previous = this.#history.pop();
    if (!previous) return false;
    this.#redo.push(this.#document);
    this.#document = previous;
    return true;
  }

  redo(): boolean {
    const next = this.#redo.pop();
    if (!next) return false;
    this.#history.push(this.#document);
    this.#document = next;
    return true;
  }

  serialize(format: "json" | "markdown" = "json"): string {
    return format === "json"
      ? JSON.stringify(this.#document)
      : richDocumentToMarkdown(this.#document.root, this.#providers);
  }
}
```

## Members [#members]

| Member          | Type                                             | Required | Description                                                                               | Related types                                                                                                                                  |
| --------------- | ------------------------------------------------ | -------- | ----------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `#document`     | `RichDocument`                                   | Yes      | The `#document` member uses the `RichDocument` contract.                                  | [`RichDocument`](/tuil/docs/reference/packages/editor/api/rich-document)                                                                            |
| `#history`      | `RichDocument[]`                                 | Yes      | The `#history` member uses the `RichDocument[]` contract.                                 | [`RichDocument`](/tuil/docs/reference/packages/editor/api/rich-document)                                                                            |
| `#redo`         | `RichDocument[]`                                 | Yes      | The `#redo` member uses the `RichDocument[]` contract.                                    | [`RichDocument`](/tuil/docs/reference/packages/editor/api/rich-document)                                                                            |
| `#providers`    | `ReadonlyMap<string, RichNodeProvider>`          | Yes      | The `#providers` member uses the `ReadonlyMap<string, RichNodeProvider>` contract.        | [`RichNodeProvider`](/tuil/docs/reference/packages/editor/api/rich-node-provider)                                                                   |
| `__constructor` | `any`                                            | Yes      | The `__constructor` member uses the `any` contract.                                       | —                                                                                                                                              |
| `snapshot`      | `() => RichDocument`                             | Yes      | The `snapshot` member uses the `() => RichDocument` contract.                             | [`RichDocument`](/tuil/docs/reference/packages/editor/api/rich-document)                                                                            |
| `dispatch`      | `(transaction: RichTransaction) => RichDocument` | Yes      | The `dispatch` member uses the `(transaction: RichTransaction) => RichDocument` contract. | [`RichDocument`](/tuil/docs/reference/packages/editor/api/rich-document), [`RichTransaction`](/tuil/docs/reference/packages/editor/api/rich-transaction) |
| `undo`          | `() => boolean`                                  | Yes      | The `undo` member uses the `() => boolean` contract.                                      | —                                                                                                                                              |
| `redo`          | `() => boolean`                                  | Yes      | The `redo` member uses the `() => boolean` contract.                                      | —                                                                                                                                              |
| `serialize`     | `(format?: "json" \| "markdown") => string`      | Yes      | The `serialize` member uses the `(format?: "json" \| "markdown") => string` contract.     | —                                                                                                                                              |

## Parameters [#parameters]

This declaration has no public members.

## Returns [#returns]

This declaration does not return a value.

## Throws [#throws]

No thrown errors are documented for this declaration.

## Related types [#related-types]

* [`RichDocument`](/tuil/docs/reference/packages/editor/api/rich-document)
* [`RichEditorProviderOptions`](/tuil/docs/reference/packages/editor/api/rich-editor-provider-options)
* [`RichNode`](/tuil/docs/reference/packages/editor/api/rich-node)
* [`RichNodeProvider`](/tuil/docs/reference/packages/editor/api/rich-node-provider)
* [`RichTransaction`](/tuil/docs/reference/packages/editor/api/rich-transaction)

## Source [#source]

[View the secondary source reference](https://github.com/mwillbanks/tuil/blob/main/packages/editor/src/rich.ts)

## Package [#package]

[@mwillbanks/tuil-editor](/tuil/docs/reference/packages/editor)
