@@ -3,33 +3,17 @@ import {fromBase64} from '../../../../util/base64/fromBase64';
3
3
import { ITimestampStruct , ts , VectorClock } from '../../../../json-crdt-patch/clock' ;
4
4
import { Model } from '../../../model' ;
5
5
import { SESSION } from '../../../../json-crdt-patch/constants' ;
6
- import {
7
- JsonCrdtNode ,
8
- ObjectJsonCrdtNode ,
9
- ArrayJsonCrdtNode ,
10
- ArrayJsonCrdtChunk ,
11
- JsonCrdtRgaTombstone ,
12
- ValueJsonCrdtNode ,
13
- StringJsonCrdtNode ,
14
- StringJsonCrdtChunk ,
15
- ConstantJsonCrdtNode ,
16
- BinaryJsonCrdtNode ,
17
- BinaryJsonCrdtChunk ,
18
- JsonCrdtSnapshot ,
19
- JsonCrdtLogicalTimestamp ,
20
- JsonCrdtTimestamp ,
21
- TupleJsonCrdtNode ,
22
- } from './types' ;
6
+ import * as types from './types' ;
23
7
24
8
export class Decoder {
25
- public decode ( { time, root} : JsonCrdtSnapshot ) : Model {
9
+ public decode ( { time, root} : types . JsonCrdtVerboseDocument ) : Model {
26
10
const isServerClock = typeof time === 'number' ;
27
11
const doc = isServerClock ? Model . withServerClock ( time ) : Model . withLogicalClock ( this . cClock ( time ) ) ;
28
12
this . cRoot ( doc , root ) ;
29
13
return doc ;
30
14
}
31
15
32
- protected cClock ( timestamps : JsonCrdtLogicalTimestamp [ ] ) : VectorClock {
16
+ protected cClock ( timestamps : types . JsonCrdtVerboseLogicalTimestamp [ ] ) : VectorClock {
33
17
const [ stamp ] = timestamps ;
34
18
const vectorClock = new VectorClock ( stamp [ 0 ] , stamp [ 1 ] ) ;
35
19
const length = timestamps . length ;
@@ -41,18 +25,18 @@ export class Decoder {
41
25
return vectorClock ;
42
26
}
43
27
44
- protected cTs ( stamp : JsonCrdtTimestamp ) : ITimestampStruct {
28
+ protected cTs ( stamp : types . JsonCrdtVerboseTimestamp ) : ITimestampStruct {
45
29
const isServerClock = typeof stamp === 'number' ;
46
30
return isServerClock ? ts ( SESSION . SERVER , stamp ) : ts ( stamp [ 0 ] , stamp [ 1 ] ) ;
47
31
}
48
32
49
- protected cRoot ( doc : Model , { node } : ValueJsonCrdtNode ) : void {
50
- const val = node ? this . cNode ( doc , node ) : new nodes . ConNode ( doc . clock . tick ( 0 ) , null ) ;
33
+ protected cRoot ( doc : Model , { value } : types . JsonCrdtVerboseVal ) : void {
34
+ const val = value ? this . cNode ( doc , value ) : new nodes . ConNode ( doc . clock . tick ( 0 ) , null ) ;
51
35
const root = new nodes . RootNode ( doc , val . id ) ;
52
36
doc . root = root ;
53
37
}
54
38
55
- protected cNode ( doc : Model , node : JsonCrdtNode ) : nodes . JsonNode {
39
+ protected cNode ( doc : Model , node : types . JsonCrdtNode ) : nodes . JsonNode {
56
40
switch ( node . type ) {
57
41
case 'obj' :
58
42
return this . cObj ( doc , node ) ;
@@ -62,44 +46,45 @@ export class Decoder {
62
46
return this . cStr ( doc , node ) ;
63
47
case 'val' :
64
48
return this . cVal ( doc , node ) ;
65
- case 'const ' :
66
- return this . cConst ( doc , node ) ;
67
- case 'tup ' :
68
- return this . cTup ( doc , node ) ;
49
+ case 'con ' :
50
+ return this . cCon ( doc , node ) ;
51
+ case 'vec ' :
52
+ return this . cVec ( doc , node ) ;
69
53
case 'bin' :
70
54
return this . cBin ( doc , node ) ;
71
55
}
72
56
throw new Error ( 'UNKNOWN_NODE' ) ;
73
57
}
74
58
75
- protected cObj ( doc : Model , node : ObjectJsonCrdtNode ) : nodes . ObjNode {
59
+ protected cObj ( doc : Model , node : types . JsonCrdtVerboseObj ) : nodes . ObjNode {
76
60
const id = this . cTs ( node . id ) ;
77
61
const obj = new nodes . ObjNode ( doc , id ) ;
78
- const keys = Object . keys ( node . keys ) ;
62
+ const map = node . map ;
63
+ const keys = Object . keys ( map ) ;
79
64
for ( const key of keys ) {
80
- const keyNode = node . keys [ key ] ;
65
+ const keyNode = map [ key ] ;
81
66
obj . put ( key , this . cNode ( doc , keyNode ) . id ) ;
82
67
}
83
68
doc . index . set ( id , obj ) ;
84
69
return obj ;
85
70
}
86
71
87
- protected cTup ( doc : Model , node : TupleJsonCrdtNode ) : nodes . VecNode {
72
+ protected cVec ( doc : Model , node : types . JsonCrdtVerboseVec ) : nodes . VecNode {
88
73
const id = this . cTs ( node . id ) ;
89
74
const obj = new nodes . VecNode ( doc , id ) ;
90
75
const elements = obj . elements ;
91
- const components = node . components ;
92
- const length = components . length ;
76
+ const map = node . map ;
77
+ const length = map . length ;
93
78
for ( let i = 0 ; i < length ; i ++ ) {
94
- const component = components [ i ] ;
79
+ const component = map [ i ] ;
95
80
if ( ! component ) elements . push ( undefined ) ;
96
81
else elements . push ( this . cNode ( doc , component ) . id ) ;
97
82
}
98
83
doc . index . set ( id , obj ) ;
99
84
return obj ;
100
85
}
101
86
102
- protected cArr ( doc : Model , node : ArrayJsonCrdtNode ) : nodes . ArrNode {
87
+ protected cArr ( doc : Model , node : types . JsonCrdtVerboseArr ) : nodes . ArrNode {
103
88
const id = this . cTs ( node . id ) ;
104
89
const rga = new nodes . ArrNode ( doc , id ) ;
105
90
const chunks = node . chunks ;
@@ -110,10 +95,10 @@ export class Decoder {
110
95
rga . ingest ( length , ( ) => {
111
96
const c = chunks [ i ++ ] ;
112
97
const id = self . cTs ( c . id ) ;
113
- if ( typeof ( c as JsonCrdtRgaTombstone ) . span === 'number' )
114
- return new nodes . ArrChunk ( id , ( c as JsonCrdtRgaTombstone ) . span , undefined ) ;
98
+ if ( typeof ( c as types . JsonCrdtVerboseTombstone ) . span === 'number' )
99
+ return new nodes . ArrChunk ( id , ( c as types . JsonCrdtVerboseTombstone ) . span , undefined ) ;
115
100
else {
116
- const ids = ( c as ArrayJsonCrdtChunk ) . nodes . map ( ( n ) => this . cNode ( doc , n ) . id ) ;
101
+ const ids = ( c as types . JsonCrdtVerboseArrChunk ) . value . map ( ( n ) => this . cNode ( doc , n ) . id ) ;
117
102
return new nodes . ArrChunk ( id , ids . length , ids ) ;
118
103
}
119
104
} ) ;
@@ -122,7 +107,7 @@ export class Decoder {
122
107
return rga ;
123
108
}
124
109
125
- protected cStr ( doc : Model , node : StringJsonCrdtNode ) : nodes . StrNode {
110
+ protected cStr ( doc : Model , node : types . JsonCrdtVerboseStr ) : nodes . StrNode {
126
111
const id = this . cTs ( node . id ) ;
127
112
const rga = new nodes . StrNode ( id ) ;
128
113
const chunks = node . chunks ;
@@ -133,10 +118,10 @@ export class Decoder {
133
118
rga . ingest ( length , ( ) => {
134
119
const c = chunks [ i ++ ] ;
135
120
const id = self . cTs ( c . id ) ;
136
- if ( typeof ( c as JsonCrdtRgaTombstone ) . span === 'number' )
137
- return new nodes . StrChunk ( id , ( c as JsonCrdtRgaTombstone ) . span , '' ) ;
121
+ if ( typeof ( c as types . JsonCrdtVerboseTombstone ) . span === 'number' )
122
+ return new nodes . StrChunk ( id , ( c as types . JsonCrdtVerboseTombstone ) . span , '' ) ;
138
123
else {
139
- const value = ( c as StringJsonCrdtChunk ) . value ;
124
+ const value = ( c as types . JsonCrdtVerboseStrChunk ) . value ;
140
125
return new nodes . StrChunk ( id , value . length , value ) ;
141
126
}
142
127
} ) ;
@@ -145,7 +130,7 @@ export class Decoder {
145
130
return rga ;
146
131
}
147
132
148
- protected cBin ( doc : Model , node : BinaryJsonCrdtNode ) : nodes . BinNode {
133
+ protected cBin ( doc : Model , node : types . JsonCrdtVerboseBin ) : nodes . BinNode {
149
134
const id = this . cTs ( node . id ) ;
150
135
const rga = new nodes . BinNode ( id ) ;
151
136
const chunks = node . chunks ;
@@ -156,10 +141,10 @@ export class Decoder {
156
141
rga . ingest ( length , ( ) => {
157
142
const c = chunks [ i ++ ] ;
158
143
const id = self . cTs ( c . id ) ;
159
- if ( typeof ( c as JsonCrdtRgaTombstone ) . span === 'number' )
160
- return new nodes . BinChunk ( id , ( c as JsonCrdtRgaTombstone ) . span , undefined ) ;
144
+ if ( typeof ( c as types . JsonCrdtVerboseTombstone ) . span === 'number' )
145
+ return new nodes . BinChunk ( id , ( c as types . JsonCrdtVerboseTombstone ) . span , undefined ) ;
161
146
else {
162
- const value = ( c as BinaryJsonCrdtChunk ) . value ;
147
+ const value = ( c as types . JsonCrdtVerboseBinChunk ) . value ;
163
148
const buf = fromBase64 ( value ) ;
164
149
return new nodes . BinChunk ( id , buf . length , buf ) ;
165
150
}
@@ -169,17 +154,17 @@ export class Decoder {
169
154
return rga ;
170
155
}
171
156
172
- protected cVal ( doc : Model , node : ValueJsonCrdtNode ) : nodes . ValNode {
157
+ protected cVal ( doc : Model , node : types . JsonCrdtVerboseVal ) : nodes . ValNode {
173
158
const id = this . cTs ( node . id ) ;
174
- const val = this . cNode ( doc , node . node ) ;
159
+ const val = this . cNode ( doc , node . value ) ;
175
160
const obj = new nodes . ValNode ( doc , id , val . id ) ;
176
161
doc . index . set ( id , obj ) ;
177
162
return obj ;
178
163
}
179
164
180
- protected cConst ( doc : Model , node : ConstantJsonCrdtNode ) : nodes . ConNode {
165
+ protected cCon ( doc : Model , node : types . JsonCrdtVerboseCon ) : nodes . ConNode {
181
166
const id = this . cTs ( node . id ) ;
182
- const val = node . timestamp ? this . cTs ( node . value as JsonCrdtLogicalTimestamp ) : node . value ;
167
+ const val = node . timestamp ? this . cTs ( node . value as types . JsonCrdtVerboseLogicalTimestamp ) : node . value ;
183
168
const obj = new nodes . ConNode ( id , val ) ;
184
169
doc . index . set ( id , obj ) ;
185
170
return obj ;
0 commit comments