Skip to content

Commit 5039f3f

Browse files
committed
refactor: Make VatStore deal in objects and arrays
1 parent eee9291 commit 5039f3f

File tree

9 files changed

+48
-52
lines changed

9 files changed

+48
-52
lines changed

packages/kernel-test/src/vatstore.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ describe('exercise vatstore', async () => {
119119
if (vatID === 'v1') {
120120
const origUpdateKVData = result.updateKVData;
121121
vi.spyOn(result, 'updateKVData').mockImplementation(
122-
(sets: Map<string, string>, deletes: Set<string>): void => {
123-
kvUpdates.push([Object.fromEntries(sets), Array.from(deletes)]);
122+
(sets: Record<string, string>, deletes: string[]): void => {
123+
kvUpdates.push([sets, deletes]);
124124
origUpdateKVData(sets, deletes);
125125
},
126126
);

packages/kernel/src/VatHandle.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ export class VatHandle {
148148
method: 'initVat',
149149
params: {
150150
vatConfig: this.config,
151-
state: Object.fromEntries(this.#vatStore.getKVData()),
151+
state: this.#vatStore.getKVData(),
152152
},
153153
});
154154
}
@@ -297,10 +297,7 @@ export class VatHandle {
297297
if (method === 'deliver' || method === 'initVat') {
298298
// TypeScript fails to narrow the result type on its own
299299
const [sets, deletes] = result as VatCheckpoint;
300-
this.#vatStore.updateKVData(
301-
new Map(Object.entries(sets)),
302-
new Set(deletes),
303-
);
300+
this.#vatStore.updateKVData(sets, deletes);
304301
}
305302
return result;
306303
}

packages/kernel/src/store/vat-kv-store.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export type VatKVStore = KVStore & {
1717
* @returns a VatKVStore wrapped around `state`.
1818
*/
1919
export function makeVatKVStore(state: Map<string, string>): VatKVStore {
20-
let sets: Map<string, string> = new Map();
20+
let sets: Record<string, string> = {};
2121
let deletes: Set<string> = new Set();
2222
let keyCache: string[] | null = null;
2323
let lastNextKey: string | null = null;
@@ -61,22 +61,19 @@ export function makeVatKVStore(state: Map<string, string>): VatKVStore {
6161
},
6262
set(key: string, value: string): void {
6363
state.set(key, value);
64-
sets.set(key, value);
64+
sets[key] = value;
6565
deletes.delete(key);
6666
keyCache = null;
6767
},
6868
delete(key: string): void {
6969
state.delete(key);
70-
sets.delete(key);
70+
delete sets[key];
7171
deletes.add(key);
7272
keyCache = null;
7373
},
7474
checkpoint(): VatCheckpoint {
75-
const result: VatCheckpoint = [
76-
Object.fromEntries(sets),
77-
Array.from(deletes),
78-
];
79-
sets = new Map();
75+
const result: VatCheckpoint = [sets, Array.from(deletes)];
76+
sets = {};
8077
deletes = new Set();
8178
return result;
8279
},

packages/kernel/test/storage.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,18 +85,20 @@ type ClearableVatStore = VatStore & {
8585
* @returns the mock {@link VatStore}.
8686
*/
8787
function makeMapVatStore(_vatID: string): ClearableVatStore {
88-
const map = new Map<string, string>();
88+
let kvData: Record<string, string> = {};
8989
return {
90-
getKVData: () => map,
91-
updateKVData: (sets: Map<string, string>, deletes: Set<string>) => {
92-
for (const [key, value] of sets.entries()) {
93-
map.set(key, value);
90+
getKVData: () => kvData,
91+
updateKVData: (sets: Record<string, string>, deletes: string[]) => {
92+
for (const [key, value] of Object.entries(sets)) {
93+
kvData[key] = value;
9494
}
95-
for (const key of deletes.values()) {
96-
map.delete(key);
95+
for (const key of deletes) {
96+
delete kvData[key];
9797
}
9898
},
99-
clear: () => map.clear(),
99+
clear: () => {
100+
kvData = {};
101+
},
100102
};
101103
}
102104

packages/store/src/sqlite/nodejs.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ const mockKVData = [
99
{ key: 'key2', value: 'value2' },
1010
];
1111

12-
const mockKVDataForMap: [string, string][] = [
13-
['key1', 'value1'],
14-
['key2', 'value2'],
15-
];
12+
const mockKVDataForMap: Record<string, string> = {
13+
key1: 'value1',
14+
key2: 'value2',
15+
};
1616

1717
const mockStatement = {
1818
run: vi.fn(),
@@ -118,17 +118,17 @@ describe('makeSQLKernelDatabase', () => {
118118
]);
119119
});
120120

121-
it('vatStore.getKVData returns a map of the data', async () => {
121+
it('vatStore.getKVData returns the data', async () => {
122122
const db = await makeSQLKernelDatabase({});
123123
const vatStore = db.makeVatStore('vvat');
124124
const data = vatStore.getKVData();
125-
expect(data).toStrictEqual(new Map(mockKVDataForMap));
125+
expect(data).toStrictEqual({ ...mockKVDataForMap });
126126
});
127127

128128
it('vatStore.updateKVData updates the database', async () => {
129129
const db = await makeSQLKernelDatabase({});
130130
const vatStore = db.makeVatStore('vvat');
131-
vatStore.updateKVData(new Map(mockKVDataForMap), new Set(['del1', 'del2']));
131+
vatStore.updateKVData({ ...mockKVDataForMap }, ['del1', 'del2']);
132132
expect(mockStatement.run).toHaveBeenCalled(); // begin transaction
133133
expect(mockStatement.run).toHaveBeenCalledWith('vvat', 'key1', 'value1'); // set
134134
expect(mockStatement.run).toHaveBeenCalledWith('vvat', 'key2', 'value2'); // set

packages/store/src/sqlite/nodejs.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,15 @@ export async function makeSQLKernelDatabase({
177177
*
178178
* @returns the vatstore contents as a key-value Map.
179179
*/
180-
function getKVData(): Map<string, string> {
181-
const result = new Map<string, string>();
180+
function getKVData(): Record<string, string> {
181+
const result: Record<string, string> = {};
182182
type KVPair = {
183183
key: string;
184184
value: string;
185185
};
186186
for (const kvPair of sqlVatstoreGetAll.iterate(vatID)) {
187187
const { key, value } = kvPair as KVPair;
188-
result.set(key, value);
188+
result[key] = value;
189189
}
190190
return result;
191191
}
@@ -197,14 +197,14 @@ export async function makeSQLKernelDatabase({
197197
* @param deletes - A set of keys that have been deleted.
198198
*/
199199
function updateKVData(
200-
sets: Map<string, string>,
201-
deletes: Set<string>,
200+
sets: Record<string, string>,
201+
deletes: string[],
202202
): void {
203203
db.transaction(() => {
204-
for (const [key, value] of sets.entries()) {
204+
for (const [key, value] of Object.entries(sets)) {
205205
sqlVatstoreSet.run(vatID, key, value);
206206
}
207-
for (const value of deletes.values()) {
207+
for (const value of deletes) {
208208
sqlVatstoreDelete.run(vatID, value);
209209
}
210210
})();

packages/store/src/sqlite/wasm.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ const mockKVData = [
1010
{ key: 'key2', value: 'value2' },
1111
] as const;
1212

13-
const mockKVDataForMap: [string, string][] = [
14-
['key1', 'value1'],
15-
['key2', 'value2'],
16-
];
13+
const mockKVDataForMap: Record<string, string> = {
14+
key1: 'value1',
15+
key2: 'value2',
16+
};
1717

1818
const mockStatement = {
1919
bind: vi.fn(),
@@ -157,13 +157,13 @@ describe('makeSQLKernelDatabase', () => {
157157
.mockReturnValueOnce(mockKVData[1].key)
158158
.mockReturnValueOnce(mockKVData[1].value);
159159
const data = vatStore.getKVData();
160-
expect(data).toStrictEqual(new Map(mockKVDataForMap));
160+
expect(data).toStrictEqual({ ...mockKVDataForMap });
161161
});
162162

163163
it('vatStore.updateKVData updates the database', async () => {
164164
const db = await makeSQLKernelDatabase({});
165165
const vatStore = db.makeVatStore('vvat');
166-
vatStore.updateKVData(new Map(mockKVDataForMap), new Set(['del1', 'del2']));
166+
vatStore.updateKVData({ ...mockKVDataForMap }, ['del1', 'del2']);
167167
// begin transaction
168168
expect(mockStatement.step).toHaveBeenCalled();
169169
expect(mockStatement.reset).toHaveBeenCalled();

packages/store/src/sqlite/wasm.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -239,14 +239,14 @@ export async function makeSQLKernelDatabase({
239239
*
240240
* @returns the vatstore contents as a key-value Map.
241241
*/
242-
function getKVData(): Map<string, string> {
243-
const result = new Map<string, string>();
242+
function getKVData(): Record<string, string> {
243+
const result: Record<string, string> = {};
244244
sqlVatstoreGetAll.bind([vatID]);
245245
try {
246246
while (sqlVatstoreGetAll.step()) {
247247
const key = sqlVatstoreGetAll.getString(0) as string;
248248
const value = sqlVatstoreGetAll.getString(1) as string;
249-
result.set(key, value);
249+
result[key] = value;
250250
}
251251
} finally {
252252
sqlVatstoreGetAll.reset();
@@ -261,18 +261,18 @@ export async function makeSQLKernelDatabase({
261261
* @param deletes - A set of keys that have been deleted.
262262
*/
263263
function updateKVData(
264-
sets: Map<string, string>,
265-
deletes: Set<string>,
264+
sets: Record<string, string>,
265+
deletes: string[],
266266
): void {
267267
try {
268268
sqlBeginTransaction.step();
269269
sqlBeginTransaction.reset();
270-
for (const [key, value] of sets.entries()) {
270+
for (const [key, value] of Object.entries(sets)) {
271271
sqlVatstoreSet.bind([vatID, key, value]);
272272
sqlVatstoreSet.step();
273273
sqlVatstoreSet.reset();
274274
}
275-
for (const value of deletes.values()) {
275+
for (const value of deletes) {
276276
sqlVatstoreDelete.bind([vatID, value]);
277277
sqlVatstoreDelete.step();
278278
sqlVatstoreDelete.reset();

packages/store/src/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ export type KVStore = {
77
};
88

99
export type VatStore = {
10-
getKVData(): Map<string, string>;
11-
updateKVData(sets: Map<string, string>, deletes: Set<string>): void;
10+
getKVData(): Record<string, string>;
11+
updateKVData(sets: Record<string, string>, deletes: string[]): void;
1212
};
1313

1414
export type KernelDatabase = {

0 commit comments

Comments
 (0)