پرش به محتوای اصلی

ذخیره‌سازی راه دور

ارسال کل وضعیت ویرایشگر با هر تغییر ناکارآمد است.
برای چنین حالتی، ویرایشگر یک API برای رونوشت‌برداری بلادرنگ داده‌ها فراهم می‌کند.

نصب​

npm install @dineug/erd-editor

مخزن رونوشت در زیرمسیر @dineug/erd-editor/engine.js قرار دارد، نه در ریشهٔ بسته.
این نقطهٔ ورود به DOM دست نمی‌زند، بنابراین در یک Web Worker یا هر جای دیگری بیرون از رشتهٔ اصلی اجرا می‌شود.
وارد کردن ریشهٔ بسته به‌جای آن به یک سند DOM نیاز دارد: از نسخهٔ 5.0.0 هیچ عنصری را تعریف نمی‌کند، اما اجرای آن هر دو کلاس عنصر را می‌سازد. پیش از 5.0.0 عنصر سفارشی <erd-editor> را ثبت می‌کرد.

نحوهٔ استفاده​

type ReplicationStore = {
readonly value: string;
readonly runtimeValue: string;
on: (
listeners: Partial<{ change: (change: ReplicationChange) => void }>
) => Unsubscribe;
setInitialValue: (value: string) => void;
dispatch: (actions: Array<AnyAction> | AnyAction) => void;
dispatchSync: (actions: Array<AnyAction> | AnyAction) => void;
destroy: () => void;
};

type ReplicationChange = {
value: string;
changed: boolean;
};

type InjectEngineContext = {
toWidth: (text: string) => number;
};

type CreateReplicationStore = (
context: InjectEngineContext
) => ReplicationStore;

// example
import { createReplicationStore } from '@dineug/erd-editor/engine.js';

const replicationStore = createReplicationStore({
toWidth: text => text.length * 10,
});

رونوشت‌برداری از ویرایشگر در حال اجرا​

کنش‌ها از مخزن مشترک یک ویرایشگر در حال اجرا می‌آیند.
ویرایش مشارکتی را ببینید.

import { createReplicationStore } from '@dineug/erd-editor/engine.js';

const replicationStore = createReplicationStore({ toWidth });
replicationStore.setInitialValue(editor.runtimeValue);

replicationStore.on({
change: ({ value, changed }) => {
if (changed) save(value);
},
});

const sharedStore = editor.getSharedStore();
sharedStore.subscribe(actions => {
replicationStore.dispatch(actions);
});

فقط تغییر از مرز عبور می‌کند و کل سند هرگز از آن نمی‌گذرد.
رونوشت آن را اعمال می‌کند و نتیجه را در سمت خودش سریال‌سازی می‌کند.
رویداد change آن نتیجه را به‌صورت value در اختیارتان می‌گذارد و changed نشان می‌دهد چه زمانی نوشتن آن ارزش دارد.

از نسخهٔ 4.0.0، رونوشت را مانند مثال بالا با runtimeValue ویرایشگر مقداردهی اولیه کنید، نه با فایل ذخیره‌شده یا value ویرایشگر.
فایل ویرایش‌هایی را که پس از ذخیره شدنش انجام شده‌اند ندارد و value موجودیت‌هایی را که در نشست حذف شده‌اند ندارد.
رونوشتی که بدون یک جدول حذف‌شده مقداردهی اولیه شده باشد، وقتی یک ویرایشگر آن حذف را واگرد کند، جدول را بدون نام و ستون‌هایش برمی‌گرداند و آن را به همان شکل ذخیره می‌کند.
از نسخهٔ 4.2.0، همین موضوع دربارهٔ واژه، اصطلاح یا دامنه‌ای که از یکی از برگه‌های واژه‌نامه حذف شده باشد نیز صدق می‌کند.
وقتی یک ویرایشگر آن حذف را واگرد کند، رونوشتی که بدون آن ردیف مقداردهی اولیه شده باشد، ردیف را دوباره به‌صورت خالی فهرست می‌کند، و چون value ردیف خالی را کنار می‌گذارد، رونوشت سند را بدون آن ذخیره می‌کند.
در مورد یک دامنه، ستون‌ها و اصطلاحاتی که به آن پیوند داده شده بودند نیز در آن رونوشت بدون پیوند می‌مانند، چون رونوشت هرگز این پیوندها را نداشته است و واگرد آن‌ها را ارسال نمی‌کند.

از نسخهٔ 5.1.0، @dineug/erd-editor-yjs می‌تواند ویرایشگرها را از طریق یک اتاق Yjs نیز همگام نگه دارد.
اگر رونوشت را مانند بالا از عنصری که به یک اتاق متصل است تغذیه کنید، فقط ویرایش‌هایی را می‌گیرد که روی همان عنصر انجام شده‌اند و هرگز ویرایش‌هایی را که اتاق می‌آورد نمی‌گیرد: آن‌ها به‌عنوان ویرایش ویرایشگری دیگر به عنصر می‌رسند، و مخزن مشترک هرگز چیزی را که دریافت کرده است بازارسال نمی‌کند.
برای ذخیرهٔ سند یک اتاق، value عنصر متصل یا value یک مخزن همتای متصل را ذخیره کنید، همان‌طور که آنچه اتاق نگه می‌دارد توضیح می‌دهد.
یک فراهم‌کنندهٔ ماندگاری Yjs خود اتاق را ذخیره می‌کند، که یک مقدار زمان اجرا و ویرایش‌های پس از آن را نگه می‌دارد، نه یک فایل؛ محدودیت‌ها را ببینید.

InjectEngineContext​

toWidth​

یک رشته را بر حسب پیکسل اندازه می‌گیرد.
مخزن DOM ندارد، پس خودش نمی‌تواند متن را اندازه بگیرد، و هر بار که یک نام، نوع داده، مقدار پیش‌فرض یا توضیح تغییر کند، عرض ستون‌ها را با این تابع دوباره محاسبه می‌کند.
از نسخهٔ 4.2.0، این شامل نام منطقی یک جدول یا ستون نیز می‌شود.
خانهٔ دامنهٔ یک ستون را، که نام دامنه‌ای را نشان می‌دهد که ستون به آن پیوند خورده است، هر بار که ستون به دامنه‌ای پیوند داده شود یا پیوندش قطع شود و هر بار که آن دامنه اضافه، تغییر نام داده یا حذف شود، اندازه می‌گیرد.
همچنین هر بار که setInitialValue سندی را بارگذاری می‌کند، همهٔ جدول‌ها و ستون‌ها را دوباره اندازه می‌گیرد.
از نسخهٔ 4.0.0، عرض‌ها فقط در runtimeValue نگه داشته می‌شوند و هرگز در value نگه داشته نمی‌شوند.
بنابراین سندی که این نسخه ذخیره کرده است، هر جا که ذخیره شده باشد و متن در آنجا هر طور اندازه‌گیری شده باشد، هنگام بازخوانی بایت به بایت همان value را می‌دهد.

به همان شیوه‌ای اندازه بگیرید که ویرایشگر اندازه می‌گیرد — 400 12px در پشتهٔ فونت ویرایشگر، گردشده، به‌علاوهٔ 2 px فاصلهٔ داخلی.
در غیر این صورت، عرض‌های موجود در runtimeValue از عرض‌های روی صفحه فاصله می‌گیرند.

const TEXT_PADDING = 2;
const FONT =
"400 12px -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, " +
"'Helvetica Neue', 'Open Sans', system-ui, sans-serif, " +
"'Apple Color Emoji', 'Segoe UI Emoji'";

let context = null;

function getContext() {
if (context) return context;

try {
context = new OffscreenCanvas(0, 0).getContext('2d');
if (context) context.font = FONT;
} catch {
// no canvas available
}

return context;
}

function toWidth(text) {
const context = getContext();
const width = context ? context.measureText(text).width : text.length * 10;

return Math.round(width) + TEXT_PADDING;
}

const replicationStore = createReplicationStore({ toWidth });

text.length * 10 مقدار جایگزین برای زمانی است که هیچ بومی در دسترس نباشد.
این مقدار برای مخزنی که سندش فقط ذخیره می‌شود و هرگز رندر نمی‌شود کافی است.

ReplicationStore​

value getter​

وضعیت فعلی ویرایشگر را سریال‌سازی می‌کند.
یک رشتهٔ JSON برمی‌گرداند که همان‌طور که هست آمادهٔ ذخیره‌سازی است — نه یک شیء تجزیه‌شده.

const data = replicationStore.value;

از نسخهٔ 4.0.0، value شکل ذخیره‌سازی است: سند به همان صورتی که یک فایل آن را نگه می‌دارد، همان متنی که خاصیت value عنصر برمی‌گرداند.
این شکل فقط موجودیت‌های حذف‌نشده را با ترتیبی ثابت نگه می‌دارد، بدون موجودیت‌های حذف‌شده، ترتیب لایه‌ها یا هر چیزی که بارگذاری دوباره محاسبه می‌کند، مانند عرض‌هایی که toWidth اندازه می‌گیرد.
از نسخهٔ 4.2.0، نام‌های منطقی، اینکه هر نام از واژه‌نامه‌ها استخراج شده است یا نه، پیوندهای دامنه و واژه‌ها، اصطلاحات و دامنه‌های زبانهٔ واژه‌نامه را نیز نگه می‌دارد.
همچنین از نسخهٔ 4.2.0، هر فیلد متنی خالی یک موجودیت، هر فهرست doc و هر مجموعه‌ای که چیزی در خود ندارد، و خود collections را وقتی همهٔ مجموعه‌ها خالی‌اند، کنار می‌گذارد.
با دو فاصله تورفتگی دارد، هر ردیف واژه‌نامه در خطی جداگانه قرار می‌گیرد و با یک نویسهٔ خط جدید پایان می‌یابد، بنابراین یک سند یکسان همیشه بایت‌های یکسانی می‌دهد.
برای آنچه نگه می‌دارد، شکل ذخیره‌سازی را ببینید.

هر تنظیمی که قفل آن روشن است با مقداری که در آن قفل شده نوشته می‌شود و هر تنظیم دیگر با مقدار فعلی‌اش.
قفل Viewport مبدأ نما و سطح بزرگ‌نمایی را با هم پوشش می‌دهد، و زبانه، زبان کد در مولد کد، هر دو شیوهٔ نگارش نام و نوع علامت نقل‌قول هر کدام قفل جداگانهٔ خود را دارند.
از نسخهٔ 4.2.0، نمایش نام‌ها نیز قفل خود را دارد، یعنی قفل Name View که در یک سند جدید روشن است.
این قفل‌ها جایگزین فیلد ignoreSaveSettings سند شده‌اند که از نسخهٔ 4.0.0 نه خوانده می‌شود و نه نوشته می‌شود.
پیش از نسخهٔ 4.0.0، value کل سند بود به همان صورتی که مخزن نگه می‌داشت، با اعمال بیت‌های پیمایش و بزرگ‌نمایی آن فیلد.

runtimeValue getter​

از نسخهٔ 4.0.0، سند را به همان صورتی که رونوشت نگه می‌دارد سریال‌سازی می‌کند، همراه با موجودیت‌های حذف‌شده و هر آنچه بارگذاری محاسبه می‌کند.
اینجا هم هر تنظیم قفل‌شده با مقدار قفل‌شده‌اش نوشته می‌شود.

const snapshot = replicationStore.runtimeValue;

از آن برای مقداردهی اولیهٔ ویرایشگر یا مخزن دیگری که بعداً می‌پیوندد، از طریق setInitialValue آن، استفاده کنید؛ ویرایش مشارکتی را ببینید.
رونوشت getLWW و getVersion ندارد، پس با runtimeValue هیچ ثبات همکاری‌ای تحویل نمی‌دهد: ویرایشگری که با آن مقداردهی اولیه شود آن‌ها را از ویرایشگرهای در حال اجرا می‌گیرد، همان‌طور که مقداردهی اولیهٔ یک همکار توضیح می‌دهد.
هرگز آن را به‌عنوان فایل ذخیره نکنید: موجودیت‌های حذف‌شده را با خود دارد و JSON Schema منتشرشده آن را رد می‌کند.
همین موجودیت‌های حذف‌شده هستند که اجازه می‌دهند واگرد یک حذف، که بعداً ارسال می‌شود، موجودیت را در مخزنی که با آن مقداردهی اولیه شده است به‌طور کامل برگرداند.
آن‌ها تا بار بعدی که سند از فایلش باز شود باقی می‌مانند؛ شکل فایل آن‌ها را در بر ندارد.

setInitialValue​

وضعیت ویرایشگری را که پیش‌تر ذخیره شده است بارگذاری می‌کند.

replicationStore.setInitialValue('json...');

شکل ذخیره‌سازی، یک مقدار زمان اجرا یا سندی را که نسخه‌ای قدیمی‌تر ذخیره کرده است، از جمله یک سند v2، می‌پذیرد.
یک رشتهٔ خالی، یا هر چیزی که رشته نباشد، به‌جای ایجاد خطا یک سند جدید و خالی بارگذاری می‌کند.
مخزنی که هرگز مقداری به آن داده نشده است با همان سند جدید آغاز می‌شود.
از نسخهٔ 4.0.0، در آن سند هر قفل روشن است، بنابراین value آن نما، زبانه، زبان کد در مولد کد، شیوه‌های نگارش نام و نوع علامت نقل‌قولی را که با آن‌ها آغاز شده است حفظ می‌کند، در حالی که ویرایشگرهایی که از آن‌ها رونوشت‌برداری می‌کند پیمایش می‌کنند، بزرگ‌نمایی می‌کنند، زبانه عوض می‌کنند یا آن تنظیمات را تغییر می‌دهند. در 3.10.0، این سند نه پیمایش را ذخیره می‌کرد و نه بزرگ‌نمایی را، و پیش از آن هر دو را ذخیره می‌کرد.
از نسخهٔ 4.2.0، نمای Physical Names را نیز در نمایش نام‌ها حفظ می‌کند، در حالی که ویرایشگرها نمای خود را تغییر می‌دهند.
یک سند ذخیره‌شده قفل‌هایی را که نام می‌برد حفظ می‌کند.
سندی که هیچ قفلی را نام نمی‌برد، یعنی هر سندی که پیش از نسخهٔ 4.0.0 ذخیره شده باشد، از جمله یک سند v2، با همهٔ قفل‌ها روشن بارگذاری می‌شود: مبدأ نمای آن در 0, 0، سطح بزرگ‌نمایی آن در 1 و زبانهٔ آن روی ERD، هر چه ذخیره کرده باشد، و زبان کد در مولد کد، شیوه‌های نگارش نام و نوع علامت نقل‌قول آن به همان صورتی که ذخیره کرده است.
سندی که پیش از نسخهٔ 4.2.0 ذخیره شده باشد، از قفل Name View نامی نمی‌برد، بنابراین با آن قفل در حالت روشن و در نمای Physical Names بارگذاری می‌شود، حتی اگر با همهٔ قفل‌های دیگر در حالت خاموش ذخیره شده باشد.
از نسخهٔ 4.0.0، setInitialValue رجیسترهای همکاری نگه‌داشته‌شده برای سند قبلی را هم دور می‌ریزد، همان‌طور که متد setInitialValue عنصر این کار را می‌کند.
متنی که JSON نیست، مانند فایلی که نشانگرهای تداخل ادغام در آن باقی مانده است، نیز خطایی ایجاد نمی‌کند: خطای تجزیه فقط در کنسول ثبت می‌شود، سند خالی می‌شود و تنظیمات همان‌طور که بودند باقی می‌مانند.

از نسخهٔ 4.0.0، بارگذاری هیچ جمع‌آوری زباله‌ای اجرا نمی‌کند، بنابراین موجودیت‌های حذف‌شده در runtimeValue باقی می‌مانند.
پیش از آن، موجودیت‌هایی را که دیگر در doc نبودند و چهار روز یا بیشتر دست نخورده بودند دور می‌ریخت.

بازنویسی‌های بارگذاری پیش از بازگشت setInitialValue تمام می‌شوند: نشانه‌های کلید روی ستون‌ها، که از گزینه‌های هر ستون و رابطه‌ها خوانده می‌شوند؛ عرض همهٔ جدول‌ها و ستون‌ها، که دوباره با toWidth اندازه‌گیری می‌شوند؛ نقاطی که هر خط اتصال به جدول‌هایش می‌رسد؛ و پرچم شناسا بودن هر رابطه و نماد انتهای والد آن.
هیچ‌یک از آن‌ها بخشی از value نیست، اما replicationStore.runtimeValue اگر بلافاصله پس از فراخوانی خوانده شود، همهٔ آن‌ها را از قبل در خود دارد.
کنشی که درست پس از بارگذاری می‌رسد، مانند یک پیمایش بازپخش‌شده، با سند بارگذاری‌شده سنجیده می‌شود، بنابراین خود بارگذاری هرگز به‌عنوان changed گزارش نمی‌شود.

بارگذاری و هیچ‌یک از این بازنویسی‌ها رویداد change را ارسال نمی‌کنند.
اگر می‌خواهید سند بارگذاری‌شده دوباره به شکل ذخیره‌سازی نوشته شود، پس از بازگشت setInitialValue خودتان replicationStore.value را بخوانید.

on@change​

مشترک تغییرات وضعیت ویرایشگر می‌شود.

const unsubscribe = replicationStore.on({
change: ({ value, changed }) => {
if (changed) {
// save value...
}
},
});

change با تأخیر تجمیعی 200 میلی‌ثانیه ارسال می‌شود، بنابراین رگباری از کنش‌ها به‌صورت یک اطلاع‌رسانی واحد می‌رسد.
این رویداد فقط برای کنش‌هایی از نوعی که می‌تواند سند را تغییر دهد ارسال می‌شود، به‌علاوهٔ settings.changeIgnoreSaveSettings که ویرایشگری قدیمی‌تر ممکن است هنوز ارسال کند (dispatch, dispatchSync را ببینید).
یک کنش حضور بازارسال‌شده یا editor.mergeLWW هرگز آن را فعال نمی‌کند.
برای لغو اشتراک، تابع بازگردانده‌شده را فراخوانی کنید.

از نسخهٔ 3.10.0، شنونده یک ReplicationChange دریافت می‌کند، نوعی که @dineug/erd-editor/engine.js در کنار ReplicationStore صادر می‌کند.
پیش از نسخهٔ 3.10.0، شنونده چیزی دریافت نمی‌کرد و شنونده‌ای که آرگومان را نادیده می‌گیرد همچنان کار می‌کند.
value سند سریال‌سازی‌شده در شکل ذخیره‌سازی است، همان رشته‌ای که replicationStore.value در آن لحظه برمی‌گرداند، بنابراین نیازی به سریال‌سازی دوبارهٔ آن نیست.
changed زمانی false است که کنش‌های پس از change قبلی، یا پس از بارگذاری، value را بایت به بایت همان‌طور که بود باقی گذاشته باشند.

تغییری که یک قفل آن را از value بیرون نگه می‌دارد همچنان change را ارسال می‌کند، با changed برابر با false، پس فقط زمانی بنویسید که changed برابر با true باشد.
این یعنی پیمایش یا بزرگ‌نمایی وقتی Viewport قفل است، تعویض زبانه وقتی Canvas Type قفل است، و تغییر زبان کد در مولد کد، یک شیوهٔ نگارش نام یا نوع علامت نقل‌قول وقتی قفل خود آن روشن است، که از نسخهٔ 5.1.0 فقط ویرایشگری پیش از نسخهٔ 5.1.0 همچنان آن را ارسال می‌کند (dispatch, dispatchSync را ببینید).
از نسخهٔ 4.2.0، تغییر نمایش نام‌ها وقتی Name View قفل است نیز همین‌طور است: ویرایشگر همچنان آن را ارسال می‌کند، اما رونوشت آن را دور می‌ریزد، همان‌طور که ویرایشگرهای دیگر این کار را می‌کنند.
تغییر نمایش نام‌ها در یک ویرایشگر فقط خواندنی نیز، قفل آن هر وضعیتی داشته باشد، به همین شیوه دور ریخته می‌شود.
رویداد change عنصر چنین تغییری را کنار می‌گذارد، اما رونوشت همچنان آن را گزارش می‌کند.
در یک سند جدید و در سندی که پیش از نسخهٔ 4.0.0 ذخیره شده باشد، همهٔ قفل‌ها روشن‌اند و در هر سندی که پیش از نسخهٔ 4.2.0 ذخیره شده باشد، Name View قفل است.
وقتی قفل Viewport باز باشد، پیمایش یا بزرگ‌نمایی value را تغییر می‌دهد، وقتی قفل Canvas Type باز باشد، باز کردن زبانهٔ دیگری از ویرایشگر نیز همین کار را می‌کند، و وقتی قفل Name View باز باشد، تغییر نمایش نام‌ها از سوی ویرایشگری که فقط خواندنی نیست نیز همین کار را می‌کند.
روشن یا خاموش کردن یک قفل نیز value را تغییر می‌دهد.

از نسخهٔ 4.0.0، changed شکل ذخیره‌سازی را مقایسه می‌کند که نه موجودیت‌های حذف‌شده را در خود دارد و نه ترتیب لایه‌ها را.
بنابراین جدولی که در یک change اضافه و دوباره حذف شود، ویرایشی که روی موجودیتی اعمال شود که همکار دیگری حذفش کرده است، و یک بارگذاری بازارسال‌شده که فقط ترتیب لایه‌ها را تغییر می‌دهد نیز همگی با changed برابر با false گزارش می‌شوند.
از نسخهٔ 4.2.0، ردیفی که به یک برگهٔ واژه‌نامه اضافه شده و خالی مانده باشد نیز همین‌طور گزارش می‌شود، چون شکل ذخیره‌سازی ردیفی را که چیزی در خود ندارد کنار می‌گذارد.

changed هرگز با فایلی که ذخیره کرده‌اید مقایسه نمی‌کند، فایلی که ممکن است از همان لحظهٔ بارگذاری با value متفاوت باشد: فایلی که نسخه‌ای قدیمی‌تر ذخیره کرده است، از جمله یک فایل v2، چنین است و فایلی که با نشانهٔ ترتیب بایت آغاز می‌شود و فایلی که دستی ویرایش شده است نیز همین‌طور.
از نسخهٔ 4.2.0، این شامل فایلی که نسخهٔ 4.0.0 یا 4.1.0 ذخیره کرده است نیز می‌شود، چون value فیلدهای متنی خالی موجودیت‌ها و فهرست‌های doc و مجموعه‌های خالی‌ای را که چنین فایلی در خود دارد کنار می‌گذارد.
مقایسهٔ بایت‌ها با چنین فایلی حتی پیمایشی را که یک قفل بیرون نگه می‌دارد یک ویرایش به حساب می‌آورد.
نخستین change با changed برابر با true چنین فایلی را به شکل ذخیره‌سازی بازمی‌گرداند، بنابراین نوشتن آن فایل را یک بار بازنویسی می‌کند.
فایلی که این نسخه ذخیره کرده است، هر جا که ذخیره شده باشد، تفاوتی ندارد، همان‌طور که toWidth توضیح می‌دهد.
اگر setInitialValue زمانی اجرا شود که یک change هنوز در انتظار است و پیش از موعد آن هیچ کنشی ارسال نشود، آن change همچنان می‌رسد، با value بارگذاری‌شده و changed برابر با false.

dispatch, dispatchSync​

تغییرات ویرایشگرهای راه دور را روی replicationStore اعمال می‌کند.

replicationStore.dispatch(actions); // async
replicationStore.dispatchSync(actions); // sync

dispatch اعمال را به یک ریزوظیفه موکول می‌کند و dispatchSync دسته را بی‌درنگ اعمال می‌کند.

می‌توانید دنبالهٔ کنش‌های یک مخزن مشترک را بدون فیلتر تحویل دهید.
هر دو متد فقط کنش‌هایی از نوعی را که می‌تواند سند را تغییر دهد، به‌علاوهٔ دو کنشی که در پایان این بخش توضیح داده شده‌اند، نگه می‌دارند و بقیه را دور می‌ریزند، بنابراین اطلاعات حضوری که یک نشست مشارکتی منتقل می‌کند — نشانگر ماوس، فوکوس، انتخاب و مستطیل انتخاب هر کاربر — بدون هیچ اثری عبور می‌کند.

از نسخهٔ 3.10.0، کنش‌های نگه‌داشته‌شده شامل relationship.changeOnDelete و relationship.changeOnUpdate هستند و relationship.add فیلدهای onDelete و onUpdate را در خود دارد.
مخزنی از نسخه‌ای قدیمی‌تر آن کنش‌ها را دور می‌ریزد و آن فیلدها را نادیده می‌گیرد، بنابراین کنش‌های ON DELETE و ON UPDATE یک رابطه را از دست می‌دهد.

از نسخهٔ 4.0.0، کنش‌های نگه‌داشته‌شده همچنین شامل table.changeGroup، هفت کنش از هشت کنش tableGroup (tableGroup.add، tableGroup.move، tableGroup.moveTo، tableGroup.remove، tableGroup.resize، tableGroup.changeName و tableGroup.changeColor، یعنی همه به‌جز tableGroup.changeZIndex که ترتیب لایه‌ها را تغییر می‌دهد)، relationship.changeColumns، settings.changeLockSettings و settings.changeDDLScript هستند.
settings.changeRelationshipOptimization دیگر وجود ندارد، بنابراین هر دو متد آن را دور می‌ریزند.
مخزنی از نسخه‌ای قدیمی‌تر کنش‌های جدید را دور می‌ریزد، بنابراین گروه‌های جدول، قفل‌ها، اسکریپت‌های طرح‌واره SQL و ستون‌هایی را که نگاشت ستون‌ها به یک رابطهٔ موجود می‌دهد از دست می‌دهد.
رونوشت را روی همان نسخه‌ای که ویرایشگرها دارند، یا نسخه‌ای جدیدتر، اجرا کنید.

نسخهٔ 4.1.0 هیچ نوع کنشی اضافه نمی‌کند و @dineug/erd-editor/engine.js را همان‌طور که بود باقی می‌گذارد، بنابراین رونوشتی با نسخهٔ 4.0.0 هر تغییری را که ویرایشگری با نسخهٔ 4.1.0 ارسال می‌کند نگه می‌دارد، درست همان‌طور که رونوشتی با نسخهٔ 4.1.0 نگه می‌دارد.
از نسخهٔ 4.1.0، Replace و Replace All در یافتن و جایگزینی نام شاخص‌ها و گروه‌های جدول را نیز تغییر می‌دهند، از طریق کنش‌های index.changeName و tableGroup.changeName که رونوشتی با نسخهٔ 4.0.0 از قبل نگه می‌دارد.
وضعیت خود کاوشگر هرگز ارسال نمی‌شود و تعویض زبانه یا پیمایشی که کاوشگر انجام می‌دهد مانند هر تعویض زبانه یا پیمایش دیگری می‌رسد؛ ویرایش مشارکتی را ببینید.

از نسخهٔ 4.2.0، کنش‌های نگه‌داشته‌شده همچنین شامل table.changeLogicalName، table.changeNameDerived، column.changeLogicalName، column.changeDomain، column.changeNameDerived، settings.changeNameViewMode و dictionary.add، dictionary.update و dictionary.remove هستند که هر ویرایش، مرتب‌سازی و وارد کردن CSV در برگه‌های واژه‌نامه را منتقل می‌کنند.
از میان تغییرهای نمایش نام‌ها، رونوشت فقط آن‌هایی را اعمال می‌کند که ویرایشگری که فقط خواندنی نیست، وقتی قفل Name View باز است، انجام می‌دهد و بقیه را دور می‌ریزد (on@change را ببینید).
مخزنی از نسخه‌ای قدیمی‌تر همهٔ این کنش‌ها را دور می‌ریزد، بنابراین نام‌های منطقی، پیوندهای دامنه، اینکه هر نام از واژه‌نامه‌ها آمده است یا نه، واژه‌ها، اصطلاحات و دامنه‌ها، و نمایش نام‌ها را از دست می‌دهد.
ویرایشگری از پیش از نسخهٔ 4.2.0 در نشست همچنان می‌تواند بخشی از این‌ها را از رونوشتی با نسخهٔ 4.2.0 بگیرد.
Import طرح‌واره SQL، GraphQL، DBML یا AML در آن ویرایشگر، البته نه Import and Add، واژه‌ها، اصطلاحات و دامنه‌های رونوشت را خالی می‌کند.
واگرد یک بارگذاری، یک Import یا clear() در آن ویرایشگر، کپی خود آن ویرایشگر از سند را، بدون نام‌های منطقی، پیوندهای دامنه یا واژه‌نامه‌ها، در رونوشت بارگذاری می‌کند؛ ترکیب نسخه‌ها را ببینید.
@dineug/erd-editor/engine.js همان createReplicationStore، ReplicationStore و ReplicationChange پیشین را صادر می‌کند و createReplicationStore همان context را می‌پذیرد.

5.1.0 هیچ نوع کنشی اضافه نمی‌کند و هیچ صادراتی از @dineug/erd-editor/engine.js را تغییر نمی‌دهد، بنابراین رونوشتی از نسخهٔ 4.2.0 به بعد همچنان هر تغییری را که ویرایشگر 5.1.0 ارسال می‌کند نگه می‌دارد.
از نسخهٔ 5.1.0، رونوشت ویرایش‌هایی را که در یک لحظه انجام می‌شوند همان‌گونه تعیین‌تکلیف می‌کند که ویرایشگرهای 5.1.0 می‌کنند؛ ویرایش‌های همزمان را ببینید.
برای موقعیت یک جدول، موقعیت و اندازهٔ یک یادداشت و یک گروه جدول، و مبدأ نما و سطح بزرگ‌نمایی، یک نسخه نگه می‌دارد.
ویرایشگر 5.1.0 یک کشیدن، پیمایش یا بزرگ‌نمایی را به‌صورت جایی که پایان می‌یابد ارسال می‌کند، از طریق table.moveTo، memo.moveTo، tableGroup.moveTo، settings.scrollTo و settings.changeZoomLevel، و رونوشت هر یک از این‌ها و نیز هر memo.resize و tableGroup.resize را فقط وقتی می‌پذیرد که نسخهٔ آن کمتر از نسخه‌ای که خودش نگه می‌دارد نباشد.
بنابراین وقتی دو تا از این ویرایشگرها یک جدول، یادداشت یا گروه جدول را در یک لحظه جابه‌جا یا تغییر اندازه می‌دهند، رونوشت آن را در همان نقطه و اندازه‌ای ذخیره می‌کند که همهٔ آن‌ها نشان می‌دهند، به هر ترتیبی که آن‌ها را بشنود، و کشیدن، پیمایش یا بزرگ‌نمایی‌ای که لایهٔ انتقال دو بار تحویل دهد، چیزی را دو بار جابه‌جا نمی‌کند.
وقتی Viewport قفل نیست، رونوشت مبدأ و سطح بزرگ‌نمایی را هر کدام از نوشتنی با بیشترین نسخه ذخیره می‌کند، یعنی همان‌جا که ویرایشگر انجام‌دهندهٔ آن نوشتن قرار داشت.
بزرگ‌نمایی مبدأ را هم جابه‌جا می‌کند، بنابراین پیمایش و بزرگ‌نمایی‌ای که دو ویرایشگر در یک لحظه انجام می‌دهند می‌تواند به‌صورت مبدأ یک ویرایشگر با سطح بزرگ‌نمایی ویرایشگر دیگر ذخیره شود.
پیش از نسخهٔ 5.1.0، رونوشت گام‌های پیمایش و بزرگ‌نمایی همهٔ ویرایشگرها را روی یک نما جمع می‌کرد.

فاصله‌هایی که ویرایشگری پیش از نسخهٔ 5.1.0 برای کشیدن، پیمایش یا بزرگ‌نمایی ارسال می‌کند (table.move، memo.move، tableGroup.move، settings.streamScrollTo و settings.streamZoomLevel) همچنان، بیرون از نسخه‌ها، به آنچه رونوشت نگه می‌دارد افزوده می‌شوند.
تغییر رنگ همچنان بدون نسخه می‌رسد: رونوشت، مانند هر ویرایشگر، آن را با نسخه‌ای از خود مهر می‌زند و رنگی را که آخر شنیده نگه می‌دارد، بنابراین دو تغییر رنگ یک جدول، یادداشت یا گروه جدول که در یک لحظه انجام شوند می‌توانند متفاوت از آنچه ویرایشگر نشان می‌دهد ذخیره شوند.
رونوشتی از پیش از نسخهٔ 5.1.0 نقطه‌ها و اندازه‌ها را به ترتیب رسیدنشان اعمال می‌کند، بنابراین می‌تواند جدولی را در جایی غیر از آنچه ویرایشگرهای 5.1.0 نشان می‌دهند ذخیره کند.
برای اینکه ویرایش‌هایی که در یک لحظه انجام می‌شوند یکسان تمام شوند، همهٔ ویرایشگرهای نشست و رونوشت را روی نسخهٔ 5.1.0 یا بالاتر نگه دارید، جز استثناهایی که ویرایش‌های همزمان فهرست می‌کند.

از نسخهٔ 5.1.0، ویرایشگر تغییر زبان کد در مولد کد، شیوهٔ نگارش نام یا نوع علامت نقل‌قول را فقط وقتی ارسال می‌کند که قفل آن تنظیم خاموش است، با نشانهٔ shared: true در محتوای آن، و رونوشت هر تغییر نشانه‌دار را اعمال می‌کند، همان‌طور که ویرایشگرها می‌کنند؛ ویرایش مشارکتی را ببینید.
رونوشت تغییر بدون نشانه را، که ویرایشگری پیش از نسخهٔ 5.1.0 بدون توجه به قفل ارسال می‌کند، فقط وقتی اعمال می‌کند که آن تنظیم در سمت خودش قفل نباشد، و وقتی تنظیم قفل است آن را دور می‌ریزد (on@change را ببینید).

از نسخهٔ 4.0.0، هر دو متد editor.mergeLWW را نیز اعمال می‌کنند، کنشی که رجیسترهای همکاری‌ای را در خود دارد که یک ویرایشگر هنگام پیوستن ویرایشگری دیگر به نشست با آن‌ها پاسخ می‌دهد، بنابراین رونوشت ویرایش‌های هم‌زمان را به همان شیوهٔ ویرایشگرها حل‌وفصل می‌کند.
این کنش هیچ بایتی از value را تغییر نمی‌دهد و هیچ رویداد change ارسال نمی‌کند.
settings.changeIgnoreSaveSettings که ویرایشگری منتشرشده پیش از نسخهٔ 4.0.0 ممکن است هنوز ارسال کند، نگه داشته می‌شود اما چیزی را تغییر نمی‌دهد: رویداد change را با changed برابر با false ارسال می‌کند.

destroy​

نمونهٔ replicationStore را به‌طور کامل از بین می‌برد.

replicationStore.destroy();

پس از آن، مخزن دیگر change ارسال نمی‌کند و فراخوانی‌های بعدی dispatch را نادیده می‌گیرد.
سند به‌جای ایجاد خطا در آخرین مقدار خود ثابت می‌ماند.
برای شروع دوباره، یک مخزن جدید ایجاد کنید.