Ga naar hoofdinhoud

Externe opslag

Het is inefficiënt om bij elke wijziging de volledige status van de editor te versturen.
Voor dat geval biedt de editor een API voor realtime replicatie van gegevens.

Installatie​

npm install @dineug/erd-editor

De replicatiestore staat in het subpad @dineug/erd-editor/engine.js, niet in de root van het pakket.
Dat ingangspunt raakt de DOM niet aan, dus het draait in een Web Worker of ergens anders buiten de hoofdthread.
Importeer je in plaats daarvan de root van het pakket, dan is een document nodig: sinds 5.0.0 definieert die geen element, maar bij het evalueren worden beide elementklassen gebouwd. Vóór 5.0.0 registreerde die het custom element <erd-editor>.

Gebruik​

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,
});

Een live editor repliceren​

De acties komen uit de gedeelde store van een live editor.
Zie Gezamenlijk bewerken.

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);
});

Alleen de wijziging gaat over de grens, nooit het hele document.
De replica past de wijziging toe en serialiseert het resultaat aan haar eigen kant.
change geeft je dat resultaat als value, en changed vertelt je wanneer het de moeite waard is om het weg te schrijven.

Initialiseer de replica sinds 4.0.0 zoals hierboven met de runtimeValue van de editor, in plaats van met het opgeslagen bestand of de value van de editor.
Het bestand mist de bewerkingen die sinds het opslaan zijn gedaan, en value mist de entiteiten die in de sessie zijn verwijderd.
Een replica die zonder een verwijderde tabel is geïnitialiseerd, brengt die tabel zonder naam of kolommen terug wanneer een editor de verwijdering ongedaan maakt, en slaat haar zo op.
Sinds 4.2.0 geldt hetzelfde voor een woord, term of domein dat van een blad van het Woordenboek is verwijderd.
Wanneer een editor de verwijdering ongedaan maakt, toont een replica die zonder de rij is geïnitialiseerd, die rij weer leeg, en omdat value een lege rij weglaat, slaat de replica het document zonder die rij op.
Bij een domein blijven ook de kolommen en termen die eraan gekoppeld waren in die replica ontkoppeld, omdat de replica de koppelingen nooit had en het ongedaan maken ze niet verstuurt.

Sinds 5.1.0 kan @dineug/erd-editor-yjs editors ook via een Yjs-room met elkaar in de pas houden.
Een replica die zoals hierboven wordt gevoed vanuit een element dat aan een room is gebonden, krijgt alleen de bewerkingen die op dat element zijn gedaan, nooit die welke de room binnenbrengt: die bereiken het element als bewerkingen van een andere editor, en een gedeelde store stuurt nooit door wat hij heeft ontvangen.
Om het document van een room op te slaan, sla je de value van het gebonden element op, of die van een gebonden peerstore, zoals Wat de room bevat beschrijft.
Een Yjs-persistentieprovider slaat de room zelf op, die een runtimewaarde en de bewerkingen sindsdien bevat in plaats van een bestand; zie Beperkingen.

InjectEngineContext​

toWidth​

Meet een string in pixels.
De store heeft geen DOM en kan tekst dus niet zelf meten, en hij berekent de kolombreedtes met deze functie opnieuw telkens wanneer een naam, gegevenstype, standaardwaarde of opmerking verandert.
Sinds 4.2.0 hoort daar ook de logische naam van een tabel of kolom bij.
Hij meet de domeincel van een kolom, die de naam toont van het domein waaraan de kolom is gekoppeld, telkens wanneer de kolom aan een domein wordt gekoppeld of ervan wordt ontkoppeld en telkens wanneer dat domein wordt toegevoegd, hernoemd of verwijderd.
Ook meet hij elke tabel en kolom opnieuw wanneer setInitialValue een document laadt.
Sinds 4.0.0 worden de breedtes alleen in runtimeValue bewaard, nooit in value.
Een document dat deze versie heeft opgeslagen, levert bij het teruglezen dus byte voor byte dezelfde value op, waar het ook is opgeslagen en hoe tekst daar ook werd gemeten.

Meet zoals de editor dat doet — 400 12px in de lettertypereeks van de editor, afgerond, plus 2 px padding.
Anders wijken de breedtes in runtimeValue af van die op het scherm.

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 is de terugvaloptie als er geen canvas beschikbaar is.
Dat volstaat voor een store waarvan het document alleen wordt opgeslagen en nooit gerenderd.

ReplicationStore​

value-getter​

Serialiseert de huidige status van de editor.
Geeft een JSON-string terug, klaar om ongewijzigd op te slaan — geen geparseerd object.

const data = replicationStore.value;

Sinds 4.0.0 is value de opslagvorm: het document zoals een bestand het bevat, dezelfde tekst die de eigenschap value van het element teruggeeft.
De opslagvorm bevat alleen de niet-verwijderde entiteiten, in een vaste volgorde, zonder de verwijderde, zonder de stapelvolgorde en zonder alles wat bij het laden opnieuw wordt bepaald, zoals de breedtes die toWidth meet.
Sinds 4.2.0 bevat de opslagvorm ook de logische namen, of elke naam uit de woordenboeken is afgeleid, de domeinkoppelingen en de woorden, termen en domeinen van het tabblad Woordenboek.
Ook laat de opslagvorm sinds 4.2.0 elk leeg tekstveld van een entiteit weg, elke lijst in doc en elke collectie die niets bevat, en collections zelf wanneer elke collectie leeg is.
De tekst is met twee spaties ingesprongen, met elke woordenboekrij op een eigen regel, en eindigt met een regeleinde, zodat hetzelfde document altijd dezelfde bytes oplevert.
Zie Opslagvorm voor wat erin staat.

Elke instelling waarvan de vergrendeling aanstaat, wordt geschreven met de waarde waarop ze is vergrendeld, en elke andere instelling zoals ze op dat moment staat.
De vergrendeling Viewport omvat de oorsprong van de weergave en het zoomniveau samen, en het tabblad, de taal van de Codegenerator, beide naamnotaties en het type aanhalingstekens hebben elk een eigen vergrendeling.
Sinds 4.2.0 heeft ook de naamweergave een eigen vergrendeling, Name View, die in een nieuw document aanstaat.
De vergrendelingen vervangen het veld ignoreSaveSettings van het document, dat sinds 4.0.0 gelezen noch geschreven wordt.
Vóór 4.0.0 was value het hele document zoals de store het bevatte, waarop de scroll- en zoombits van dat veld waren toegepast.

runtimeValue-getter​

Serialiseert sinds 4.0.0 het document zoals de replica het bevat, inclusief de verwijderde entiteiten en alles wat bij het laden wordt bepaald.
Ook hier wordt elke vergrendelde instelling met haar vergrendelde waarde geschreven.

const snapshot = replicationStore.runtimeValue;

Gebruik het om een editor of een andere store die later aansluit, via zijn setInitialValue te initialiseren; zie Gezamenlijk bewerken.
Een replica heeft geen getLWW of getVersion, dus ze levert met runtimeValue geen samenwerkingsregisters mee: een editor die ermee wordt geïnitialiseerd, haalt ze bij de lopende editors op, zoals Een medebewerker initialiseren beschrijft.
Sla het nooit op als het bestand: het bevat de verwijderde entiteiten, en het gepubliceerde JSON Schema weigert het.
Juist die verwijderde entiteiten zorgen ervoor dat het later verstuurde ongedaan maken van een verwijdering de entiteit volledig terugbrengt in de store die ermee is geïnitialiseerd.
Ze blijven bestaan tot het document de volgende keer vanuit zijn bestand wordt geopend, waarvan de vorm ze weglaat.

setInitialValue​

Laadt de eerder opgeslagen status van de editor.

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

De methode accepteert de opslagvorm, een runtimewaarde of een document dat een eerdere versie heeft opgeslagen, ook een v2-document.
Een lege string, of alles wat geen string is, laadt een nieuw, leeg document in plaats van een fout te veroorzaken.
Een store die nooit een waarde heeft gekregen, begint met hetzelfde nieuwe document.
Sinds 4.0.0 staat in dat document elke vergrendeling aan, zodat de value ervan de weergave, het tabblad, de taal van de Codegenerator, de naamnotaties en het type aanhalingstekens behoudt waarmee het begon, terwijl de editors die de store repliceert, scrollen, zoomen, van tabblad wisselen of die instellingen wijzigen. In 3.10.0 sloeg het noch de scrollpositie noch het zoomniveau op, en daarvoor sloeg het beide op.
Sinds 4.2.0 behoudt het ook zijn naamweergave, Physical Names, terwijl de editors van weergave wisselen.
Een opgeslagen document behoudt de vergrendelingen die het vermeldt.
Een document dat er geen vermeldt, en dat is elk document dat vóór 4.0.0 is opgeslagen, ook een v2-document, wordt geladen met elke vergrendeling aan: de oorsprong van de weergave op 0, 0, het zoomniveau op 1 en het tabblad op ERD, ongeacht wat het heeft opgeslagen, en de taal van de Codegenerator, de naamnotaties en het type aanhalingstekens zoals het die heeft opgeslagen.
Een document dat vóór 4.2.0 is opgeslagen, vermeldt geen vergrendeling Name View en wordt dus geladen met die vergrendeling aan en in de weergave Physical Names, ook als het is opgeslagen met elke andere vergrendeling uit.
Sinds 4.0.0 wist setInitialValue ook de samenwerkingsregisters die voor het vorige document werden bijgehouden, zoals de methode setInitialValue van het element dat doet.
Ook tekst die geen JSON is, zoals een bestand met achtergebleven markeringen van een mergeconflict, veroorzaakt geen fout: de parseerfout wordt alleen in de console gelogd, het document wordt leeggemaakt en de instellingen blijven zoals ze waren.

Sinds 4.0.0 voert het laden geen garbage collection uit, zodat verwijderde entiteiten in runtimeValue blijven.
Daarvoor verwijderde het de entiteiten die niet meer in doc voorkwamen en al vier dagen of langer niet waren gewijzigd.

De herschrijvingen bij het laden zijn klaar voordat setInitialValue terugkeert: de sleutelmarkeringen op kolommen, afgeleid uit de opties van elke kolom en uit de relaties; elke tabel- en kolombreedte, opnieuw gemeten met toWidth; de punten waar elke verbindingslijn op haar tabellen aansluit; en van elke relatie de vlag die aangeeft of ze identificerend is en het symbool aan de kant van de oudertabel.
Geen ervan hoort bij value, maar replicationStore.runtimeValue bevat ze allemaal al wanneer je het direct na de aanroep leest.
Een actie die direct na het laden binnenkomt, zoals een opnieuw afgespeelde scroll, wordt afgemeten aan het geladen document, zodat het laden zelf nooit als changed wordt gemeld.

Noch het laden noch een van deze herschrijvingen verstuurt change.
Lees replicationStore.value zelf zodra setInitialValue terugkeert als je het geladen document in de opslagvorm wilt terugschrijven.

on@change​

Abonneert zich op wijzigingen in de status van de editor.

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

change heeft een debounce van 200 ms, zodat een snelle reeks acties als één notificatie binnenkomt.
Het treedt alleen op bij acties van een soort die het document kan wijzigen, plus de settings.changeIgnoreSaveSettings die een oudere editor nog kan versturen (zie dispatch, dispatchSync).
Een doorgestuurde aanwezigheidsactie of editor.mergeLWW wekt het nooit.
Roep de geretourneerde functie aan om het abonnement op te zeggen.

Sinds 3.10.0 ontvangt de listener een ReplicationChange, een type dat @dineug/erd-editor/engine.js naast ReplicationStore exporteert.
Vóór 3.10.0 ontving de listener niets, en een listener die het argument negeert, blijft werken.
value is het geserialiseerde document in de opslagvorm, dezelfde string die replicationStore.value op dat moment teruggeeft, dus je hoeft het niet opnieuw te serialiseren.
changed is false wanneer de acties sinds de vorige change, of sinds het laden, value byte voor byte ongewijzigd hebben gelaten.

Een wijziging die een vergrendeling buiten value houdt, leidt toch tot change, met changed op false, dus schrijf alleen weg wanneer changed true is.
Het gaat om een scroll of zoom terwijl Viewport vergrendeld is, een tabbladwissel terwijl Canvas Type vergrendeld is en een wijziging van de taal van de Codegenerator, een naamnotatie of het type aanhalingstekens terwijl de eigen vergrendeling daarvan aanstaat, wat sinds 5.1.0 alleen nog een editor van vóór 5.1.0 verstuurt (zie dispatch, dispatchSync).
Sinds 4.2.0 geldt dat ook voor een wissel van naamweergave terwijl Name View vergrendeld is: de editor verstuurt hem nog steeds, maar de replica laat hem vallen, net als de andere editors.
Een wissel van naamweergave die in een editor in alleen-lezenmodus wordt gemaakt, laat de replica op dezelfde manier vallen, hoe de vergrendeling ook staat.
Het event change van het element laat zo'n wijziging weg, maar de replica meldt die toch.
In een nieuw document en in een document dat vóór 4.0.0 is opgeslagen, staat elke vergrendeling aan, en in elk document dat vóór 4.2.0 is opgeslagen, is Name View vergrendeld.
Is Viewport ontgrendeld, dan wijzigt een scroll of zoom value; is Canvas Type ontgrendeld, dan doet het openen van een ander tabblad van de editor dat ook; en is Name View ontgrendeld, dan doet een wissel van naamweergave vanuit een editor die niet alleen-lezen is dat ook.
Ook het in- of uitschakelen van een vergrendeling wijzigt value.

Sinds 4.0.0 vergelijkt changed de opslagvorm, die noch de verwijderde entiteiten noch de stapelvolgorde bevat.
Een tabel die binnen één change wordt toegevoegd en weer verwijderd, een bewerking die terechtkomt op een entiteit die een andere medebewerker heeft verwijderd en een doorgestuurde laadactie die alleen de stapelvolgorde wijzigt, leveren dus allemaal ook changed op false op.
Sinds 4.2.0 geldt dat ook voor een rij die aan een blad van het Woordenboek wordt toegevoegd en leeg blijft, omdat de opslagvorm een rij weglaat die niets bevat.

changed vergelijkt nooit met je opgeslagen bestand, dat na het laden al van value kan afwijken: dat geldt voor een bestand dat een eerdere versie heeft opgeslagen, ook een v2-bestand, en evengoed voor een bestand dat met een byte order mark begint en een bestand dat met de hand is bewerkt.
Sinds 4.2.0 geldt dat ook voor een bestand dat 4.0.0 of 4.1.0 heeft opgeslagen, omdat value de lege tekstvelden van de entiteiten en de lege lijsten in doc en lege collecties weglaat die zo'n bestand bevat.
Een bytevergelijking met zo'n bestand zou zelfs een scroll die door een vergrendeling wordt weggelaten, als bewerking tellen.
De eerste change met changed op true geeft zo'n bestand terug in de opslagvorm, zodat het wegschrijven ervan het bestand eenmalig herschrijft.
Een bestand dat deze versie heeft opgeslagen, wijkt niet af, waar het ook is opgeslagen, zoals toWidth uitlegt.
Als setInitialValue wordt aangeroepen terwijl er nog een change uitstaat, en er niets wordt gedispatcht voordat het zover is, komt die change toch, met de geladen value en changed op false.

dispatch, dispatchSync​

Past wijzigingen van externe editors toe op de replicationStore.

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

dispatch stelt het toepassen uit tot een microtask, en dispatchSync past de batch meteen toe.

Je kunt de stream van een gedeelde store ongefilterd doorgeven.
Beide methoden behouden alleen de acties van een soort die het document kan wijzigen, plus de twee die aan het einde van dit gedeelte worden beschreven, en laten de rest vallen, zodat de aanwezigheidsgegevens die een sessie voor gezamenlijk bewerken meestuurt — de muiscursor, de focus, de selectie en het sleepkader van elke gebruiker — zonder effect passeren.

Sinds 3.10.0 horen relationship.changeOnDelete en relationship.changeOnUpdate bij de behouden acties, en bevat relationship.add de velden onDelete en onUpdate.
Een store uit een eerdere versie laat die acties vallen en negeert die velden, waardoor hij van een relatie de acties ON DELETE en ON UPDATE verliest.

Sinds 4.0.0 horen bij de behouden acties ook table.changeGroup, zeven van de acht acties van tableGroup (tableGroup.add, tableGroup.move, tableGroup.moveTo, tableGroup.remove, tableGroup.resize, tableGroup.changeName en tableGroup.changeColor, alle behalve de wijziging van de stapelvolgorde tableGroup.changeZIndex), relationship.changeColumns, settings.changeLockSettings en settings.changeDDLScript.
settings.changeRelationshipOptimization bestaat niet meer, dus beide methoden laten die actie vallen.
Een store uit een eerdere versie laat de nieuwe acties vallen en verliest zo de tabelgroepen, de vergrendelingen, de scripts van Schema SQL en de kolommen die de functie Kolommen toewijzen aan een bestaande relatie geeft.
Draai de replica op dezelfde versie als de editors, of op een nieuwere.

4.1.0 voegt geen actietype toe en laat @dineug/erd-editor/engine.js ongewijzigd, zodat een replica van 4.0.0 elke wijziging behoudt die een editor van 4.1.0 verstuurt, net als een replica van 4.1.0.
Sinds 4.1.0 wijzigen Replace en Replace All in Zoeken en vervangen ook de namen van indexen en tabelgroepen, via de acties index.changeName en tableGroup.changeName die een replica van 4.0.0 al behoudt.
De eigen status van de Verkenner wordt nooit verstuurd, en een tabbladwissel of scroll die de Verkenner uitvoert, komt binnen zoals elke andere tabbladwissel of scroll; zie Gezamenlijk bewerken.

Sinds 4.2.0 horen bij de behouden acties ook table.changeLogicalName, table.changeNameDerived, column.changeLogicalName, column.changeDomain, column.changeNameDerived, settings.changeNameViewMode en dictionary.add, dictionary.update en dictionary.remove, die elke bewerking, sortering en CSV-import op de bladen van het Woordenboek overbrengen.
Een replica past alleen de wissels van naamweergave toe die een bewerkbare editor maakt terwijl Name View ontgrendeld is, en laat de rest vallen (zie on@change).
Een store uit een eerdere versie laat al deze acties vallen en verliest zo de logische namen, de domeinkoppelingen, de informatie of elke naam van de woordenboeken komt, de woorden, termen en domeinen en de naamweergave.
Een editor van vóór 4.2.0 in de sessie kan een replica van 4.2.0 nog steeds een deel hiervan afnemen.
Een Import van Schema SQL, GraphQL, DBML of AML op die editor, al geldt dat niet voor een Import and Add, maakt de woorden, termen en domeinen van de replica leeg.
Wanneer die editor een laadactie, een Import of clear() ongedaan maakt, laadt hij zijn eigen kopie van het document in de replica, zonder logische namen, domeinkoppelingen of woordenboeken; zie Versies combineren.
@dineug/erd-editor/engine.js exporteert dezelfde createReplicationStore, ReplicationStore en ReplicationChange als voorheen, en createReplicationStore accepteert dezelfde context.

5.1.0 voegt geen actietype toe en wijzigt geen export van @dineug/erd-editor/engine.js, dus een replica van 4.2.0 of later houdt nog steeds elke wijziging bij die een editor van 5.1.0 verstuurt.
Sinds 5.1.0 handelt de replica bewerkingen op hetzelfde moment af zoals de editors van 5.1.0 dat doen; zie Gelijktijdige bewerkingen.
Ze houdt een versie bij voor de positie van een tabel, voor de positie en grootte van een memo en een tabelgroep, en voor de oorsprong van de weergave en het zoomniveau.
Een editor van 5.1.0 verstuurt een sleep, een pan of een zoom als de plek waar die eindigt, via table.moveTo, memo.moveTo, tableGroup.moveTo, settings.scrollTo en settings.changeZoomLevel, en de replica neemt elk van die acties, en elke memo.resize en tableGroup.resize, alleen over wanneer de versie ervan niet onder de versie ligt die ze bijhoudt.
Als twee van deze editors dus op hetzelfde moment één tabel, memo of tabelgroep verplaatsen of van grootte wijzigen, slaat de replica die op met de positie en grootte die elk van hen toont, in welke volgorde ze de acties ook hoort, en verplaatst een sleep, pan of zoom die het transport twee keer aflevert niets twee keer.
Is Viewport ontgrendeld, dan slaat de replica de oorsprong en het zoomniveau elk op uit de schrijfactie met de grootste versie, waar de editor die haar uitvoerde, stond.
Een zoom verplaatst ook de oorsprong, dus een pan en een zoom die twee editors op hetzelfde moment doen, kunnen worden opgeslagen als de oorsprong van de ene editor met het zoomniveau van de andere.
Vóór 5.1.0 telde de replica de pan- en zoomstappen van alle editors op tot één weergave.

De afstanden die een editor van vóór 5.1.0 voor een sleep, een pan of een zoom verstuurt (table.move, memo.move, tableGroup.move, settings.streamScrollTo en settings.streamZoomLevel) worden nog steeds opgeteld bij wat de replica bijhoudt, buiten de versies om.
Een kleurwijziging komt nog steeds zonder versie aan: de replica voorziet haar, net als elke editor, van een eigen versie en houdt de kleur die ze het laatst hoorde, dus twee kleurwijzigingen van één tabel, memo of tabelgroep op hetzelfde moment kunnen anders worden opgeslagen dan een editor toont.
Een replica van vóór 5.1.0 past de posities en groottes toe in de volgorde waarin ze aankomen, dus ze kan een tabel elders opslaan dan waar de editors van 5.1.0 haar tonen.
Houd elke editor in de sessie, en de replica, op 5.1.0 of later opdat bewerkingen op hetzelfde moment overal op hetzelfde uitkomen, op de uitzonderingen na die Gelijktijdige bewerkingen opsomt.

Sinds 5.1.0 verstuurt een editor een wijziging van de taal van de Codegenerator, een naamnotatie of het type aanhalingstekens alleen terwijl de vergrendeling van die instelling uitstaat, gemarkeerd met shared: true in de payload, en past de replica elke gemarkeerde toe, zoals de editors dat doen; zie Gezamenlijk bewerken.
Een niet-gemarkeerde, die een editor van vóór 5.1.0 ongeacht de vergrendeling verstuurt, past de replica alleen toe terwijl die instelling aan haar kant ontgrendeld is, en ze laat die vallen terwijl de instelling vergrendeld is (zie on@change).

Sinds 4.0.0 passen beide methoden ook editor.mergeLWW toe, dat de samenwerkingsregisters bevat waarmee een editor antwoordt wanneer een andere editor zich bij de sessie aansluit, zodat de replica gelijktijdige bewerkingen op dezelfde manier afhandelt als de editors.
Dat wijzigt geen enkele byte van value en leidt niet tot change.
settings.changeIgnoreSaveSettings, dat een editor van vóór 4.0.0 nog kan versturen, wordt behouden maar wijzigt niets: het leidt tot change met changed op false.

destroy​

Vernietigt de replicationStore-instantie volledig.

replicationStore.destroy();

Daarna verstuurt de store geen change meer en negeert hij verdere dispatches.
Het document bevriest op zijn laatste waarde in plaats van een fout te veroorzaken.
Maak een nieuwe store om opnieuw te beginnen.