cojson 0.8.36 → 0.8.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/native/coValues/coMap.js +62 -43
- package/dist/native/coValues/coMap.js.map +1 -1
- package/dist/web/coValues/coMap.js +62 -43
- package/dist/web/coValues/coMap.js.map +1 -1
- package/package.json +1 -1
- package/src/coValues/coMap.ts +94 -68
- package/src/tests/coMap.test.ts +24 -0
package/CHANGELOG.md
CHANGED
|
@@ -12,16 +12,33 @@ export class RawCoMapView {
|
|
|
12
12
|
this.latest = {};
|
|
13
13
|
this.latestTxMadeAt = 0;
|
|
14
14
|
this.options = options;
|
|
15
|
+
this.cachedOps = options?.cachedOps;
|
|
16
|
+
this.validSortedTransactions = options?.validSortedTransactions;
|
|
15
17
|
this.processLatestTransactions();
|
|
16
18
|
}
|
|
19
|
+
/** @internal */
|
|
20
|
+
getValidSortedTransactions() {
|
|
21
|
+
if (this.validSortedTransactions) {
|
|
22
|
+
return this.validSortedTransactions;
|
|
23
|
+
}
|
|
24
|
+
const validSortedTransactions = this.core.getValidSortedTransactions({
|
|
25
|
+
ignorePrivateTransactions: this.options?.ignorePrivateTransactions ?? false,
|
|
26
|
+
});
|
|
27
|
+
this.validSortedTransactions = validSortedTransactions;
|
|
28
|
+
return validSortedTransactions;
|
|
29
|
+
}
|
|
30
|
+
resetCachedValues() {
|
|
31
|
+
this.validSortedTransactions = undefined;
|
|
32
|
+
this.cachedOps = undefined;
|
|
33
|
+
}
|
|
17
34
|
processLatestTransactions() {
|
|
35
|
+
// Reset all internal state and cached values
|
|
18
36
|
this.latest = {};
|
|
19
37
|
this.latestTxMadeAt = 0;
|
|
20
|
-
const {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
if (options?.atTime && madeAt > options.atTime) {
|
|
38
|
+
const { latest } = this;
|
|
39
|
+
const atTimeFilter = this.options?.atTime;
|
|
40
|
+
for (const { txID, changes, madeAt } of this.getValidSortedTransactions()) {
|
|
41
|
+
if (atTimeFilter && madeAt > atTimeFilter) {
|
|
25
42
|
continue;
|
|
26
43
|
}
|
|
27
44
|
if (madeAt > this.latestTxMadeAt) {
|
|
@@ -48,12 +65,16 @@ export class RawCoMapView {
|
|
|
48
65
|
}
|
|
49
66
|
}
|
|
50
67
|
}
|
|
68
|
+
revalidateTransactions() {
|
|
69
|
+
this.resetCachedValues();
|
|
70
|
+
this.processLatestTransactions();
|
|
71
|
+
}
|
|
51
72
|
getOps() {
|
|
52
73
|
if (this.cachedOps) {
|
|
53
74
|
return this.cachedOps;
|
|
54
75
|
}
|
|
55
76
|
const ops = {};
|
|
56
|
-
for (const { txID, changes, madeAt
|
|
77
|
+
for (const { txID, changes, madeAt } of this.getValidSortedTransactions()) {
|
|
57
78
|
for (let changeIdx = 0; changeIdx < changes.length; changeIdx++) {
|
|
58
79
|
const change = changes[changeIdx];
|
|
59
80
|
let entries = ops[change.key];
|
|
@@ -89,6 +110,8 @@ export class RawCoMapView {
|
|
|
89
110
|
const clone = new RawCoMapView(this.core, {
|
|
90
111
|
ignorePrivateTransactions: this.options?.ignorePrivateTransactions ?? false,
|
|
91
112
|
atTime: time,
|
|
113
|
+
cachedOps: this.cachedOps,
|
|
114
|
+
validSortedTransactions: this.validSortedTransactions,
|
|
92
115
|
});
|
|
93
116
|
Object.setPrototypeOf(clone, this);
|
|
94
117
|
return clone;
|
|
@@ -99,8 +122,9 @@ export class RawCoMapView {
|
|
|
99
122
|
if (key === "constructor") {
|
|
100
123
|
return undefined;
|
|
101
124
|
}
|
|
102
|
-
|
|
103
|
-
|
|
125
|
+
const atTimeFilter = this.options?.atTime;
|
|
126
|
+
if (atTimeFilter) {
|
|
127
|
+
return this.getOps()[key]?.filter((op) => op.madeAt <= atTimeFilter);
|
|
104
128
|
}
|
|
105
129
|
else {
|
|
106
130
|
return this.getOps()[key];
|
|
@@ -112,15 +136,11 @@ export class RawCoMapView {
|
|
|
112
136
|
* @category 1. Reading */
|
|
113
137
|
keys() {
|
|
114
138
|
return Object.keys(this.latest).filter((key) => {
|
|
115
|
-
const
|
|
116
|
-
if (!
|
|
117
|
-
return
|
|
139
|
+
const latestChange = this.latest[key];
|
|
140
|
+
if (!latestChange) {
|
|
141
|
+
return false;
|
|
118
142
|
}
|
|
119
|
-
|
|
120
|
-
const lastEntry = includeUntil
|
|
121
|
-
? this.getOps()[key]?.findLast((entry) => entry.madeAt <= includeUntil)
|
|
122
|
-
: latest;
|
|
123
|
-
if (lastEntry?.change.op === "del") {
|
|
143
|
+
if (latestChange.change.op === "del") {
|
|
124
144
|
return false;
|
|
125
145
|
}
|
|
126
146
|
else {
|
|
@@ -134,25 +154,21 @@ export class RawCoMapView {
|
|
|
134
154
|
* @category 1. Reading
|
|
135
155
|
**/
|
|
136
156
|
get(key) {
|
|
137
|
-
const
|
|
138
|
-
if (!
|
|
157
|
+
const latestChange = this.latest[key];
|
|
158
|
+
if (!latestChange) {
|
|
139
159
|
return undefined;
|
|
140
160
|
}
|
|
141
|
-
|
|
142
|
-
const lastEntry = includeUntil
|
|
143
|
-
? this.timeFilteredOps(key)?.findLast((entry) => entry.madeAt <= includeUntil)
|
|
144
|
-
: latest;
|
|
145
|
-
if (lastEntry?.change.op === "del") {
|
|
161
|
+
if (latestChange.change.op === "del") {
|
|
146
162
|
return undefined;
|
|
147
163
|
}
|
|
148
164
|
else {
|
|
149
|
-
return
|
|
165
|
+
return latestChange.change.value;
|
|
150
166
|
}
|
|
151
167
|
}
|
|
152
168
|
/** @category 1. Reading */
|
|
153
169
|
asObject() {
|
|
154
170
|
const object = {};
|
|
155
|
-
for (const key of
|
|
171
|
+
for (const key of Object.keys(this.latest)) {
|
|
156
172
|
const value = this.get(key);
|
|
157
173
|
if (value !== undefined) {
|
|
158
174
|
object[key] = value;
|
|
@@ -166,28 +182,25 @@ export class RawCoMapView {
|
|
|
166
182
|
}
|
|
167
183
|
/** @category 5. Edit history */
|
|
168
184
|
nthEditAt(key, n) {
|
|
169
|
-
const ops = this.
|
|
170
|
-
|
|
185
|
+
const ops = this.getOps()[key];
|
|
186
|
+
const atTimeFilter = this.options?.atTime;
|
|
187
|
+
const entry = ops?.[n];
|
|
188
|
+
if (!entry) {
|
|
171
189
|
return undefined;
|
|
172
190
|
}
|
|
173
|
-
|
|
174
|
-
if (this.atTimeFilter && entry.madeAt > this.atTimeFilter) {
|
|
191
|
+
if (atTimeFilter && entry.madeAt > atTimeFilter) {
|
|
175
192
|
return undefined;
|
|
176
193
|
}
|
|
177
|
-
return
|
|
178
|
-
by: accountOrAgentIDfromSessionID(entry.txID.sessionID),
|
|
179
|
-
tx: entry.txID,
|
|
180
|
-
at: new Date(entry.madeAt),
|
|
181
|
-
value: entry.change.op === "del" ? undefined : entry.change.value,
|
|
182
|
-
};
|
|
194
|
+
return operationToEditEntry(entry);
|
|
183
195
|
}
|
|
184
196
|
/** @category 5. Edit history */
|
|
185
197
|
lastEditAt(key) {
|
|
186
198
|
const ops = this.timeFilteredOps(key);
|
|
187
|
-
|
|
199
|
+
const lastEntry = ops?.[ops.length - 1];
|
|
200
|
+
if (!lastEntry) {
|
|
188
201
|
return undefined;
|
|
189
202
|
}
|
|
190
|
-
return
|
|
203
|
+
return operationToEditEntry(lastEntry);
|
|
191
204
|
}
|
|
192
205
|
/** @category 5. Edit history */
|
|
193
206
|
*editsAt(key) {
|
|
@@ -195,8 +208,8 @@ export class RawCoMapView {
|
|
|
195
208
|
if (!ops) {
|
|
196
209
|
return;
|
|
197
210
|
}
|
|
198
|
-
for (
|
|
199
|
-
yield
|
|
211
|
+
for (const entry of ops) {
|
|
212
|
+
yield operationToEditEntry(entry);
|
|
200
213
|
}
|
|
201
214
|
}
|
|
202
215
|
/** @category 3. Subscription */
|
|
@@ -224,8 +237,7 @@ export class RawCoMap extends RawCoMapView {
|
|
|
224
237
|
value: isCoValue(value) ? value.id : value,
|
|
225
238
|
},
|
|
226
239
|
], privacy);
|
|
227
|
-
this.
|
|
228
|
-
this.cachedOps = undefined;
|
|
240
|
+
this.revalidateTransactions();
|
|
229
241
|
}
|
|
230
242
|
/** Delete the given key (setting it to undefined).
|
|
231
243
|
*
|
|
@@ -242,8 +254,15 @@ export class RawCoMap extends RawCoMapView {
|
|
|
242
254
|
key,
|
|
243
255
|
},
|
|
244
256
|
], privacy);
|
|
245
|
-
this.
|
|
246
|
-
this.cachedOps = undefined;
|
|
257
|
+
this.revalidateTransactions();
|
|
247
258
|
}
|
|
248
259
|
}
|
|
260
|
+
export function operationToEditEntry(op) {
|
|
261
|
+
return {
|
|
262
|
+
by: accountOrAgentIDfromSessionID(op.txID.sessionID),
|
|
263
|
+
tx: op.txID,
|
|
264
|
+
at: new Date(op.madeAt),
|
|
265
|
+
value: op.change.op === "del" ? undefined : op.change.value,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
249
268
|
//# sourceMappingURL=coMap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coMap.js","sourceRoot":"","sources":["../../../src/coValues/coMap.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,6BAA6B,EAAE,MAAM,+CAA+C,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAuBtD,MAAM,OAAO,YAAY;
|
|
1
|
+
{"version":3,"file":"coMap.js","sourceRoot":"","sources":["../../../src/coValues/coMap.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,16 +12,33 @@ export class RawCoMapView {
|
|
|
12
12
|
this.latest = {};
|
|
13
13
|
this.latestTxMadeAt = 0;
|
|
14
14
|
this.options = options;
|
|
15
|
+
this.cachedOps = options?.cachedOps;
|
|
16
|
+
this.validSortedTransactions = options?.validSortedTransactions;
|
|
15
17
|
this.processLatestTransactions();
|
|
16
18
|
}
|
|
19
|
+
/** @internal */
|
|
20
|
+
getValidSortedTransactions() {
|
|
21
|
+
if (this.validSortedTransactions) {
|
|
22
|
+
return this.validSortedTransactions;
|
|
23
|
+
}
|
|
24
|
+
const validSortedTransactions = this.core.getValidSortedTransactions({
|
|
25
|
+
ignorePrivateTransactions: this.options?.ignorePrivateTransactions ?? false,
|
|
26
|
+
});
|
|
27
|
+
this.validSortedTransactions = validSortedTransactions;
|
|
28
|
+
return validSortedTransactions;
|
|
29
|
+
}
|
|
30
|
+
resetCachedValues() {
|
|
31
|
+
this.validSortedTransactions = undefined;
|
|
32
|
+
this.cachedOps = undefined;
|
|
33
|
+
}
|
|
17
34
|
processLatestTransactions() {
|
|
35
|
+
// Reset all internal state and cached values
|
|
18
36
|
this.latest = {};
|
|
19
37
|
this.latestTxMadeAt = 0;
|
|
20
|
-
const {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
if (options?.atTime && madeAt > options.atTime) {
|
|
38
|
+
const { latest } = this;
|
|
39
|
+
const atTimeFilter = this.options?.atTime;
|
|
40
|
+
for (const { txID, changes, madeAt } of this.getValidSortedTransactions()) {
|
|
41
|
+
if (atTimeFilter && madeAt > atTimeFilter) {
|
|
25
42
|
continue;
|
|
26
43
|
}
|
|
27
44
|
if (madeAt > this.latestTxMadeAt) {
|
|
@@ -48,12 +65,16 @@ export class RawCoMapView {
|
|
|
48
65
|
}
|
|
49
66
|
}
|
|
50
67
|
}
|
|
68
|
+
revalidateTransactions() {
|
|
69
|
+
this.resetCachedValues();
|
|
70
|
+
this.processLatestTransactions();
|
|
71
|
+
}
|
|
51
72
|
getOps() {
|
|
52
73
|
if (this.cachedOps) {
|
|
53
74
|
return this.cachedOps;
|
|
54
75
|
}
|
|
55
76
|
const ops = {};
|
|
56
|
-
for (const { txID, changes, madeAt
|
|
77
|
+
for (const { txID, changes, madeAt } of this.getValidSortedTransactions()) {
|
|
57
78
|
for (let changeIdx = 0; changeIdx < changes.length; changeIdx++) {
|
|
58
79
|
const change = changes[changeIdx];
|
|
59
80
|
let entries = ops[change.key];
|
|
@@ -89,6 +110,8 @@ export class RawCoMapView {
|
|
|
89
110
|
const clone = new RawCoMapView(this.core, {
|
|
90
111
|
ignorePrivateTransactions: this.options?.ignorePrivateTransactions ?? false,
|
|
91
112
|
atTime: time,
|
|
113
|
+
cachedOps: this.cachedOps,
|
|
114
|
+
validSortedTransactions: this.validSortedTransactions,
|
|
92
115
|
});
|
|
93
116
|
Object.setPrototypeOf(clone, this);
|
|
94
117
|
return clone;
|
|
@@ -99,8 +122,9 @@ export class RawCoMapView {
|
|
|
99
122
|
if (key === "constructor") {
|
|
100
123
|
return undefined;
|
|
101
124
|
}
|
|
102
|
-
|
|
103
|
-
|
|
125
|
+
const atTimeFilter = this.options?.atTime;
|
|
126
|
+
if (atTimeFilter) {
|
|
127
|
+
return this.getOps()[key]?.filter((op) => op.madeAt <= atTimeFilter);
|
|
104
128
|
}
|
|
105
129
|
else {
|
|
106
130
|
return this.getOps()[key];
|
|
@@ -112,15 +136,11 @@ export class RawCoMapView {
|
|
|
112
136
|
* @category 1. Reading */
|
|
113
137
|
keys() {
|
|
114
138
|
return Object.keys(this.latest).filter((key) => {
|
|
115
|
-
const
|
|
116
|
-
if (!
|
|
117
|
-
return
|
|
139
|
+
const latestChange = this.latest[key];
|
|
140
|
+
if (!latestChange) {
|
|
141
|
+
return false;
|
|
118
142
|
}
|
|
119
|
-
|
|
120
|
-
const lastEntry = includeUntil
|
|
121
|
-
? this.getOps()[key]?.findLast((entry) => entry.madeAt <= includeUntil)
|
|
122
|
-
: latest;
|
|
123
|
-
if (lastEntry?.change.op === "del") {
|
|
143
|
+
if (latestChange.change.op === "del") {
|
|
124
144
|
return false;
|
|
125
145
|
}
|
|
126
146
|
else {
|
|
@@ -134,25 +154,21 @@ export class RawCoMapView {
|
|
|
134
154
|
* @category 1. Reading
|
|
135
155
|
**/
|
|
136
156
|
get(key) {
|
|
137
|
-
const
|
|
138
|
-
if (!
|
|
157
|
+
const latestChange = this.latest[key];
|
|
158
|
+
if (!latestChange) {
|
|
139
159
|
return undefined;
|
|
140
160
|
}
|
|
141
|
-
|
|
142
|
-
const lastEntry = includeUntil
|
|
143
|
-
? this.timeFilteredOps(key)?.findLast((entry) => entry.madeAt <= includeUntil)
|
|
144
|
-
: latest;
|
|
145
|
-
if (lastEntry?.change.op === "del") {
|
|
161
|
+
if (latestChange.change.op === "del") {
|
|
146
162
|
return undefined;
|
|
147
163
|
}
|
|
148
164
|
else {
|
|
149
|
-
return
|
|
165
|
+
return latestChange.change.value;
|
|
150
166
|
}
|
|
151
167
|
}
|
|
152
168
|
/** @category 1. Reading */
|
|
153
169
|
asObject() {
|
|
154
170
|
const object = {};
|
|
155
|
-
for (const key of
|
|
171
|
+
for (const key of Object.keys(this.latest)) {
|
|
156
172
|
const value = this.get(key);
|
|
157
173
|
if (value !== undefined) {
|
|
158
174
|
object[key] = value;
|
|
@@ -166,28 +182,25 @@ export class RawCoMapView {
|
|
|
166
182
|
}
|
|
167
183
|
/** @category 5. Edit history */
|
|
168
184
|
nthEditAt(key, n) {
|
|
169
|
-
const ops = this.
|
|
170
|
-
|
|
185
|
+
const ops = this.getOps()[key];
|
|
186
|
+
const atTimeFilter = this.options?.atTime;
|
|
187
|
+
const entry = ops?.[n];
|
|
188
|
+
if (!entry) {
|
|
171
189
|
return undefined;
|
|
172
190
|
}
|
|
173
|
-
|
|
174
|
-
if (this.atTimeFilter && entry.madeAt > this.atTimeFilter) {
|
|
191
|
+
if (atTimeFilter && entry.madeAt > atTimeFilter) {
|
|
175
192
|
return undefined;
|
|
176
193
|
}
|
|
177
|
-
return
|
|
178
|
-
by: accountOrAgentIDfromSessionID(entry.txID.sessionID),
|
|
179
|
-
tx: entry.txID,
|
|
180
|
-
at: new Date(entry.madeAt),
|
|
181
|
-
value: entry.change.op === "del" ? undefined : entry.change.value,
|
|
182
|
-
};
|
|
194
|
+
return operationToEditEntry(entry);
|
|
183
195
|
}
|
|
184
196
|
/** @category 5. Edit history */
|
|
185
197
|
lastEditAt(key) {
|
|
186
198
|
const ops = this.timeFilteredOps(key);
|
|
187
|
-
|
|
199
|
+
const lastEntry = ops?.[ops.length - 1];
|
|
200
|
+
if (!lastEntry) {
|
|
188
201
|
return undefined;
|
|
189
202
|
}
|
|
190
|
-
return
|
|
203
|
+
return operationToEditEntry(lastEntry);
|
|
191
204
|
}
|
|
192
205
|
/** @category 5. Edit history */
|
|
193
206
|
*editsAt(key) {
|
|
@@ -195,8 +208,8 @@ export class RawCoMapView {
|
|
|
195
208
|
if (!ops) {
|
|
196
209
|
return;
|
|
197
210
|
}
|
|
198
|
-
for (
|
|
199
|
-
yield
|
|
211
|
+
for (const entry of ops) {
|
|
212
|
+
yield operationToEditEntry(entry);
|
|
200
213
|
}
|
|
201
214
|
}
|
|
202
215
|
/** @category 3. Subscription */
|
|
@@ -224,8 +237,7 @@ export class RawCoMap extends RawCoMapView {
|
|
|
224
237
|
value: isCoValue(value) ? value.id : value,
|
|
225
238
|
},
|
|
226
239
|
], privacy);
|
|
227
|
-
this.
|
|
228
|
-
this.cachedOps = undefined;
|
|
240
|
+
this.revalidateTransactions();
|
|
229
241
|
}
|
|
230
242
|
/** Delete the given key (setting it to undefined).
|
|
231
243
|
*
|
|
@@ -242,8 +254,15 @@ export class RawCoMap extends RawCoMapView {
|
|
|
242
254
|
key,
|
|
243
255
|
},
|
|
244
256
|
], privacy);
|
|
245
|
-
this.
|
|
246
|
-
this.cachedOps = undefined;
|
|
257
|
+
this.revalidateTransactions();
|
|
247
258
|
}
|
|
248
259
|
}
|
|
260
|
+
export function operationToEditEntry(op) {
|
|
261
|
+
return {
|
|
262
|
+
by: accountOrAgentIDfromSessionID(op.txID.sessionID),
|
|
263
|
+
tx: op.txID,
|
|
264
|
+
at: new Date(op.madeAt),
|
|
265
|
+
value: op.change.op === "del" ? undefined : op.change.value,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
249
268
|
//# sourceMappingURL=coMap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coMap.js","sourceRoot":"","sources":["../../../src/coValues/coMap.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,6BAA6B,EAAE,MAAM,+CAA+C,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAuBtD,MAAM,OAAO,YAAY;
|
|
1
|
+
{"version":3,"file":"coMap.js","sourceRoot":"","sources":["../../../src/coValues/coMap.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/coValues/coMap.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CoID, RawCoValue } from "../coValue.js";
|
|
2
|
-
import { CoValueCore } from "../coValueCore.js";
|
|
2
|
+
import { CoValueCore, DecryptedTransaction } from "../coValueCore.js";
|
|
3
3
|
import { AgentID, TransactionID } from "../ids.js";
|
|
4
4
|
import { JsonObject, JsonValue } from "../jsonValue.js";
|
|
5
5
|
import { accountOrAgentIDfromSessionID } from "../typeUtils/accountOrAgentIDfromSessionID.js";
|
|
@@ -49,6 +49,9 @@ export class RawCoMapView<
|
|
|
49
49
|
cachedOps?: {
|
|
50
50
|
[Key in keyof Shape & string]?: MapOp<Key, Shape[Key]>[];
|
|
51
51
|
};
|
|
52
|
+
/** @internal */
|
|
53
|
+
validSortedTransactions?: DecryptedTransaction[];
|
|
54
|
+
|
|
52
55
|
/** @internal */
|
|
53
56
|
options?: { ignorePrivateTransactions: boolean; atTime?: number };
|
|
54
57
|
/** @internal */
|
|
@@ -59,27 +62,58 @@ export class RawCoMapView<
|
|
|
59
62
|
/** @internal */
|
|
60
63
|
constructor(
|
|
61
64
|
core: CoValueCore,
|
|
62
|
-
options?: {
|
|
65
|
+
options?: {
|
|
66
|
+
ignorePrivateTransactions: boolean;
|
|
67
|
+
atTime?: number;
|
|
68
|
+
validSortedTransactions?: DecryptedTransaction[];
|
|
69
|
+
cachedOps?: {
|
|
70
|
+
[Key in keyof Shape & string]?: MapOp<Key, Shape[Key]>[];
|
|
71
|
+
};
|
|
72
|
+
},
|
|
63
73
|
) {
|
|
64
74
|
this.id = core.id as CoID<this>;
|
|
65
75
|
this.core = core;
|
|
66
76
|
this.latest = {};
|
|
67
77
|
this.latestTxMadeAt = 0;
|
|
68
78
|
this.options = options;
|
|
79
|
+
this.cachedOps = options?.cachedOps;
|
|
80
|
+
this.validSortedTransactions = options?.validSortedTransactions;
|
|
69
81
|
|
|
70
82
|
this.processLatestTransactions();
|
|
71
83
|
}
|
|
72
84
|
|
|
73
|
-
|
|
85
|
+
/** @internal */
|
|
86
|
+
private getValidSortedTransactions() {
|
|
87
|
+
if (this.validSortedTransactions) {
|
|
88
|
+
return this.validSortedTransactions;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const validSortedTransactions = this.core.getValidSortedTransactions({
|
|
92
|
+
ignorePrivateTransactions:
|
|
93
|
+
this.options?.ignorePrivateTransactions ?? false,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
this.validSortedTransactions = validSortedTransactions;
|
|
97
|
+
|
|
98
|
+
return validSortedTransactions;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private resetCachedValues() {
|
|
102
|
+
this.validSortedTransactions = undefined;
|
|
103
|
+
this.cachedOps = undefined;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private processLatestTransactions() {
|
|
107
|
+
// Reset all internal state and cached values
|
|
74
108
|
this.latest = {};
|
|
75
109
|
this.latestTxMadeAt = 0;
|
|
76
110
|
|
|
77
|
-
const {
|
|
111
|
+
const { latest } = this;
|
|
112
|
+
|
|
113
|
+
const atTimeFilter = this.options?.atTime;
|
|
78
114
|
|
|
79
|
-
for (const { txID, changes, madeAt } of
|
|
80
|
-
|
|
81
|
-
})) {
|
|
82
|
-
if (options?.atTime && madeAt > options.atTime) {
|
|
115
|
+
for (const { txID, changes, madeAt } of this.getValidSortedTransactions()) {
|
|
116
|
+
if (atTimeFilter && madeAt > atTimeFilter) {
|
|
83
117
|
continue;
|
|
84
118
|
}
|
|
85
119
|
|
|
@@ -111,6 +145,11 @@ export class RawCoMapView<
|
|
|
111
145
|
}
|
|
112
146
|
}
|
|
113
147
|
|
|
148
|
+
revalidateTransactions() {
|
|
149
|
+
this.resetCachedValues();
|
|
150
|
+
this.processLatestTransactions();
|
|
151
|
+
}
|
|
152
|
+
|
|
114
153
|
private getOps() {
|
|
115
154
|
if (this.cachedOps) {
|
|
116
155
|
return this.cachedOps;
|
|
@@ -120,11 +159,7 @@ export class RawCoMapView<
|
|
|
120
159
|
[Key in keyof Shape & string]?: MapOp<Key, Shape[Key]>[];
|
|
121
160
|
} = {};
|
|
122
161
|
|
|
123
|
-
for (const {
|
|
124
|
-
txID,
|
|
125
|
-
changes,
|
|
126
|
-
madeAt,
|
|
127
|
-
} of this.core.getValidSortedTransactions(this.options)) {
|
|
162
|
+
for (const { txID, changes, madeAt } of this.getValidSortedTransactions()) {
|
|
128
163
|
for (let changeIdx = 0; changeIdx < changes.length; changeIdx++) {
|
|
129
164
|
const change = changes[changeIdx] as MapOpPayload<
|
|
130
165
|
keyof Shape & string,
|
|
@@ -168,6 +203,8 @@ export class RawCoMapView<
|
|
|
168
203
|
ignorePrivateTransactions:
|
|
169
204
|
this.options?.ignorePrivateTransactions ?? false,
|
|
170
205
|
atTime: time,
|
|
206
|
+
cachedOps: this.cachedOps,
|
|
207
|
+
validSortedTransactions: this.validSortedTransactions,
|
|
171
208
|
});
|
|
172
209
|
Object.setPrototypeOf(clone, this);
|
|
173
210
|
return clone as this;
|
|
@@ -182,10 +219,10 @@ export class RawCoMapView<
|
|
|
182
219
|
return undefined;
|
|
183
220
|
}
|
|
184
221
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
);
|
|
222
|
+
const atTimeFilter = this.options?.atTime;
|
|
223
|
+
|
|
224
|
+
if (atTimeFilter) {
|
|
225
|
+
return this.getOps()[key]?.filter((op) => op.madeAt <= atTimeFilter);
|
|
189
226
|
} else {
|
|
190
227
|
return this.getOps()[key];
|
|
191
228
|
}
|
|
@@ -197,17 +234,13 @@ export class RawCoMapView<
|
|
|
197
234
|
* @category 1. Reading */
|
|
198
235
|
keys<K extends keyof Shape & string = keyof Shape & string>(): K[] {
|
|
199
236
|
return (Object.keys(this.latest) as K[]).filter((key) => {
|
|
200
|
-
const
|
|
201
|
-
if (!latest) {
|
|
202
|
-
return undefined;
|
|
203
|
-
}
|
|
237
|
+
const latestChange = this.latest[key];
|
|
204
238
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
: latest!;
|
|
239
|
+
if (!latestChange) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
209
242
|
|
|
210
|
-
if (
|
|
243
|
+
if (latestChange.change.op === "del") {
|
|
211
244
|
return false;
|
|
212
245
|
} else {
|
|
213
246
|
return true;
|
|
@@ -221,22 +254,15 @@ export class RawCoMapView<
|
|
|
221
254
|
* @category 1. Reading
|
|
222
255
|
**/
|
|
223
256
|
get<K extends keyof Shape & string>(key: K): Shape[K] | undefined {
|
|
224
|
-
const
|
|
225
|
-
if (!
|
|
257
|
+
const latestChange = this.latest[key];
|
|
258
|
+
if (!latestChange) {
|
|
226
259
|
return undefined;
|
|
227
260
|
}
|
|
228
261
|
|
|
229
|
-
|
|
230
|
-
const lastEntry = includeUntil
|
|
231
|
-
? this.timeFilteredOps(key)?.findLast(
|
|
232
|
-
(entry) => entry.madeAt <= includeUntil,
|
|
233
|
-
)
|
|
234
|
-
: latest;
|
|
235
|
-
|
|
236
|
-
if (lastEntry?.change.op === "del") {
|
|
262
|
+
if (latestChange.change.op === "del") {
|
|
237
263
|
return undefined;
|
|
238
264
|
} else {
|
|
239
|
-
return
|
|
265
|
+
return latestChange.change.value as Shape[K];
|
|
240
266
|
}
|
|
241
267
|
}
|
|
242
268
|
|
|
@@ -248,7 +274,7 @@ export class RawCoMapView<
|
|
|
248
274
|
[K in keyof Shape & string]: Shape[K];
|
|
249
275
|
}> = {};
|
|
250
276
|
|
|
251
|
-
for (const key of
|
|
277
|
+
for (const key of Object.keys(this.latest) as (keyof Shape & string)[]) {
|
|
252
278
|
const value = this.get(key);
|
|
253
279
|
if (value !== undefined) {
|
|
254
280
|
object[key] = value;
|
|
@@ -268,34 +294,21 @@ export class RawCoMapView<
|
|
|
268
294
|
}
|
|
269
295
|
|
|
270
296
|
/** @category 5. Edit history */
|
|
271
|
-
nthEditAt<K extends keyof Shape & string>(
|
|
272
|
-
key
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
at: Date;
|
|
279
|
-
value?: Shape[K];
|
|
280
|
-
}
|
|
281
|
-
| undefined {
|
|
282
|
-
const ops = this.timeFilteredOps(key);
|
|
283
|
-
if (!ops || ops.length <= n) {
|
|
297
|
+
nthEditAt<K extends keyof Shape & string>(key: K, n: number) {
|
|
298
|
+
const ops = this.getOps()[key];
|
|
299
|
+
|
|
300
|
+
const atTimeFilter = this.options?.atTime;
|
|
301
|
+
const entry = ops?.[n];
|
|
302
|
+
|
|
303
|
+
if (!entry) {
|
|
284
304
|
return undefined;
|
|
285
305
|
}
|
|
286
306
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
if (this.atTimeFilter && entry.madeAt > this.atTimeFilter) {
|
|
307
|
+
if (atTimeFilter && entry.madeAt > atTimeFilter) {
|
|
290
308
|
return undefined;
|
|
291
309
|
}
|
|
292
310
|
|
|
293
|
-
return
|
|
294
|
-
by: accountOrAgentIDfromSessionID(entry.txID.sessionID),
|
|
295
|
-
tx: entry.txID,
|
|
296
|
-
at: new Date(entry.madeAt),
|
|
297
|
-
value: entry.change.op === "del" ? undefined : entry.change.value,
|
|
298
|
-
};
|
|
311
|
+
return operationToEditEntry(entry);
|
|
299
312
|
}
|
|
300
313
|
|
|
301
314
|
/** @category 5. Edit history */
|
|
@@ -310,10 +323,13 @@ export class RawCoMapView<
|
|
|
310
323
|
}
|
|
311
324
|
| undefined {
|
|
312
325
|
const ops = this.timeFilteredOps(key);
|
|
313
|
-
|
|
326
|
+
const lastEntry = ops?.[ops.length - 1];
|
|
327
|
+
|
|
328
|
+
if (!lastEntry) {
|
|
314
329
|
return undefined;
|
|
315
330
|
}
|
|
316
|
-
|
|
331
|
+
|
|
332
|
+
return operationToEditEntry(lastEntry);
|
|
317
333
|
}
|
|
318
334
|
|
|
319
335
|
/** @category 5. Edit history */
|
|
@@ -323,8 +339,8 @@ export class RawCoMapView<
|
|
|
323
339
|
return;
|
|
324
340
|
}
|
|
325
341
|
|
|
326
|
-
for (
|
|
327
|
-
yield
|
|
342
|
+
for (const entry of ops) {
|
|
343
|
+
yield operationToEditEntry(entry);
|
|
328
344
|
}
|
|
329
345
|
}
|
|
330
346
|
|
|
@@ -370,8 +386,7 @@ export class RawCoMap<
|
|
|
370
386
|
privacy,
|
|
371
387
|
);
|
|
372
388
|
|
|
373
|
-
this.
|
|
374
|
-
this.cachedOps = undefined;
|
|
389
|
+
this.revalidateTransactions();
|
|
375
390
|
}
|
|
376
391
|
|
|
377
392
|
/** Delete the given key (setting it to undefined).
|
|
@@ -396,7 +411,18 @@ export class RawCoMap<
|
|
|
396
411
|
privacy,
|
|
397
412
|
);
|
|
398
413
|
|
|
399
|
-
this.
|
|
400
|
-
this.cachedOps = undefined;
|
|
414
|
+
this.revalidateTransactions();
|
|
401
415
|
}
|
|
402
416
|
}
|
|
417
|
+
|
|
418
|
+
export function operationToEditEntry<
|
|
419
|
+
K extends string,
|
|
420
|
+
V extends JsonValue | undefined,
|
|
421
|
+
>(op: MapOp<K, V>) {
|
|
422
|
+
return {
|
|
423
|
+
by: accountOrAgentIDfromSessionID(op.txID.sessionID),
|
|
424
|
+
tx: op.txID,
|
|
425
|
+
at: new Date(op.madeAt),
|
|
426
|
+
value: op.change.op === "del" ? undefined : op.change.value,
|
|
427
|
+
};
|
|
428
|
+
}
|
package/src/tests/coMap.test.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { expect, test } from "vitest";
|
|
2
2
|
import { expectMap } from "../coValue.js";
|
|
3
|
+
import { operationToEditEntry } from "../coValues/coMap.js";
|
|
3
4
|
import { WasmCrypto } from "../crypto/WasmCrypto.js";
|
|
4
5
|
import { LocalNode } from "../localNode.js";
|
|
5
6
|
import { accountOrAgentIDfromSessionID } from "../typeUtils/accountOrAgentIDfromSessionID.js";
|
|
@@ -82,6 +83,29 @@ test("Can get CoMap entry values at different points in time", () => {
|
|
|
82
83
|
expect(content.atTime(beforeA).get("hello")).toEqual(undefined);
|
|
83
84
|
expect(content.atTime(beforeB).get("hello")).toEqual("A");
|
|
84
85
|
expect(content.atTime(beforeC).get("hello")).toEqual("B");
|
|
86
|
+
|
|
87
|
+
const ops = content.timeFilteredOps("hello");
|
|
88
|
+
|
|
89
|
+
expect(content.atTime(beforeC).lastEditAt("hello")).toEqual(
|
|
90
|
+
operationToEditEntry(ops![1]!),
|
|
91
|
+
);
|
|
92
|
+
expect(content.atTime(beforeC).nthEditAt("hello", 0)).toEqual(
|
|
93
|
+
operationToEditEntry(ops![0]!),
|
|
94
|
+
);
|
|
95
|
+
expect(content.atTime(beforeC).nthEditAt("hello", 2)).toEqual(undefined);
|
|
96
|
+
|
|
97
|
+
expect([...content.atTime(beforeC).editsAt("hello")]).toEqual([
|
|
98
|
+
operationToEditEntry(ops![0]!),
|
|
99
|
+
operationToEditEntry(ops![1]!),
|
|
100
|
+
]);
|
|
101
|
+
|
|
102
|
+
expect(content.atTime(beforeB).asObject()).toEqual({
|
|
103
|
+
hello: "A",
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
expect(content.atTime(beforeC).asObject()).toEqual({
|
|
107
|
+
hello: "B",
|
|
108
|
+
});
|
|
85
109
|
});
|
|
86
110
|
|
|
87
111
|
test("Can get all historic values of key in CoMap", () => {
|