From 430184586f4db710457e1693a8763233b92749d2 Mon Sep 17 00:00:00 2001 From: Hackerwins Date: Thu, 30 May 2024 14:57:46 +0900 Subject: [PATCH] Add ServerSeq into ChangeInfo Co-authored-by: Yourim Cha --- src/api/converter.ts | 20 ++++++++++++++------ src/devtools/index.ts | 1 + src/document/change/change_id.ts | 29 +++++++++++++++++++++++++---- src/document/document.ts | 12 ++++++++++++ 4 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/api/converter.ts b/src/api/converter.ts index 01470b6a8..cb159cfdc 100644 --- a/src/api/converter.ts +++ b/src/api/converter.ts @@ -770,10 +770,16 @@ function toChangePack(pack: ChangePack): PbChangePack { * `fromChangeID` converts the given Protobuf format to model format. */ function fromChangeID(pbChangeID: PbChangeID): ChangeID { + let serverSeq: Long | undefined; + if (pbChangeID.serverSeq) { + serverSeq = Long.fromString(pbChangeID.serverSeq, true); + } + return ChangeID.of( pbChangeID.clientSeq, Long.fromString(pbChangeID.lamport, true), toHexString(pbChangeID.actorId), + serverSeq, ); } @@ -1182,13 +1188,15 @@ function fromOperation(pbOperation: PbOperation): Operation | undefined { const attributes = new Map(); const attributesToRemove = pbTreeStyleOperation.attributesToRemove; const createdAtMapByActor = new Map(); - Object.entries(pbTreeStyleOperation!.createdAtMapByActor).forEach( - ([key, value]) => { - createdAtMapByActor.set(key, fromTimeTicket(value)); - }, - ); + if (pbTreeStyleOperation?.createdAtMapByActor) { + Object.entries(pbTreeStyleOperation!.createdAtMapByActor).forEach( + ([key, value]) => { + createdAtMapByActor.set(key, fromTimeTicket(value)); + }, + ); + } - if (attributesToRemove.length > 0) { + if (attributesToRemove?.length > 0) { return TreeStyleOperation.createTreeRemoveStyleOperation( fromTimeTicket(pbTreeStyleOperation!.parentCreatedAt)!, fromTreePos(pbTreeStyleOperation!.from!), diff --git a/src/devtools/index.ts b/src/devtools/index.ts index c4c900f1a..31e1020fb 100644 --- a/src/devtools/index.ts +++ b/src/devtools/index.ts @@ -34,6 +34,7 @@ const unsubsByDocKey = new Map void>>(); * IndexedDB will be used. */ const transactionEventsByDocKey = new Map>(); +(window as any).transactionEventsByDocKey = transactionEventsByDocKey; /** * `sendToPanel` sends a message to the devtools panel. diff --git a/src/document/change/change_id.ts b/src/document/change/change_id.ts index 7446e23dc..d797eb602 100644 --- a/src/document/change/change_id.ts +++ b/src/document/change/change_id.ts @@ -33,8 +33,14 @@ export class ChangeID { private lamport: Long; private actor: ActorID; - constructor(clientSeq: number, lamport: Long, actor: ActorID) { + constructor( + clientSeq: number, + lamport: Long, + actor: ActorID, + serverSeq?: Long, + ) { this.clientSeq = clientSeq; + this.serverSeq = serverSeq; this.lamport = lamport; this.actor = actor; } @@ -42,8 +48,13 @@ export class ChangeID { /** * `of` creates a new instance of ChangeID. */ - public static of(clientSeq: number, lamport: Long, actor: ActorID): ChangeID { - return new ChangeID(clientSeq, lamport, actor); + public static of( + clientSeq: number, + lamport: Long, + actor: ActorID, + serverSeq?: Long, + ): ChangeID { + return new ChangeID(clientSeq, lamport, actor, serverSeq); } /** @@ -77,7 +88,7 @@ export class ChangeID { * `setActor` sets the given actor. */ public setActor(actorID: ActorID): ChangeID { - return new ChangeID(this.clientSeq, this.lamport, actorID); + return new ChangeID(this.clientSeq, this.lamport, actorID, this.serverSeq); } /** @@ -87,6 +98,16 @@ export class ChangeID { return this.clientSeq; } + /** + * `getServerSeq` returns the server sequence of this ID. + */ + public getServerSeq(): string { + if (this.serverSeq) { + return this.serverSeq.toString(); + } + return ''; + } + /** * `getLamport` returns the lamport clock of this ID. */ diff --git a/src/document/document.ts b/src/document/document.ts index 89cf144d3..ca482c89e 100644 --- a/src/document/document.ts +++ b/src/document/document.ts @@ -304,6 +304,8 @@ export interface ChangeInfo { message: string; operations: Array; actor: ActorID; + clientSeq: number; + serverSeq: string; } /** @@ -704,6 +706,8 @@ export class Document { message: change.getMessage() || '', operations: opInfos, actor: actorID, + clientSeq: change.getID().getClientSeq(), + serverSeq: change.getID().getServerSeq(), }, rawChange: this.isEnableDevtools() ? change.toStruct() : undefined, }); @@ -1370,6 +1374,8 @@ export class Document { source, value: { actor: actorID, + clientSeq: change.getID().getClientSeq(), + serverSeq: change.getID().getServerSeq(), message: change.getMessage() || '', operations: opInfos, }, @@ -1380,6 +1386,8 @@ export class Document { source, value: { actor: actorID, + clientSeq: change.getID().getClientSeq(), + serverSeq: change.getID().getServerSeq(), message: change.getMessage() || '', operations: opInfos, }, @@ -1785,6 +1793,8 @@ export class Document { message: change.getMessage() || '', operations: opInfos, actor: actorID, + clientSeq: change.getID().getClientSeq(), + serverSeq: change.getID().getServerSeq(), }, rawChange: this.isEnableDevtools() ? change.toStruct() : undefined, }); @@ -1876,6 +1886,8 @@ export class Document { message: change.getMessage() || '', operations: opInfos, actor: actorID, + clientSeq: change.getID().getClientSeq(), + serverSeq: change.getID().getServerSeq(), }, rawChange: this.isEnableDevtools() ? change.toStruct() : undefined, });