@fireproof/core 0.7.3-dev.1 → 0.8.0-dev
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/blockstore.js +6 -0
- package/dist/database.js +6 -3
- package/dist/fireproof.js +1 -0
- package/dist/loader.js +0 -4
- package/dist/prolly.js +1 -1
- package/dist/remote.js +46 -0
- package/dist/src/fireproof.d.ts +2 -2
- package/dist/src/fireproof.js +74 -68
- package/dist/src/fireproof.js.map +1 -1
- package/dist/src/fireproof.mjs +74 -68
- package/dist/src/fireproof.mjs.map +1 -1
- package/dist/storage/base.js +53 -15
- package/dist/storage/ucan.js +0 -39
- package/package.json +1 -5
- package/src/blockstore.js +4 -0
- package/src/database.js +5 -3
- package/src/fireproof.js +1 -0
- package/src/loader.js +0 -5
- package/src/prolly.js +1 -1
- package/src/storage/base.js +61 -15
- package/src/storage/ucan.js +0 -44
package/dist/blockstore.js
CHANGED
@@ -207,6 +207,11 @@ export const doTransaction = async (label, blockstore, doFun, doSync = true) =>
|
|
207
207
|
const innerBlockstore = blockstore.begin(label);
|
208
208
|
try {
|
209
209
|
const result = await doFun(innerBlockstore);
|
210
|
+
// console.log('doTransaction', label, 'result', result.head)
|
211
|
+
if (result && result.head) {
|
212
|
+
innerBlockstore.head = result.head;
|
213
|
+
}
|
214
|
+
// pass the latest clock head for writing to the valet
|
210
215
|
// @ts-ignore
|
211
216
|
await blockstore.commit(innerBlockstore, doSync);
|
212
217
|
return result;
|
@@ -223,6 +228,7 @@ export const doTransaction = async (label, blockstore, doFun, doSync = true) =>
|
|
223
228
|
export class InnerBlockstore {
|
224
229
|
/** @type {Map<string, Uint8Array>} */
|
225
230
|
blocks = new Map();
|
231
|
+
head = [];
|
226
232
|
lastCid = null;
|
227
233
|
label = '';
|
228
234
|
parentBlockstore = null;
|
package/dist/database.js
CHANGED
@@ -83,7 +83,7 @@ export class Database {
|
|
83
83
|
}
|
84
84
|
toHeader() {
|
85
85
|
return {
|
86
|
-
clock: this.clockToJSON(),
|
86
|
+
// clock: this.clockToJSON(),
|
87
87
|
name: this.name,
|
88
88
|
index: {
|
89
89
|
key: this.indexBlocks.valet?.primary.keyMaterial,
|
@@ -257,11 +257,14 @@ export class Database {
|
|
257
257
|
* @memberof Fireproof
|
258
258
|
* @instance
|
259
259
|
*/
|
260
|
-
async put({ _id, _proof, ...doc }) {
|
260
|
+
async put({ _id, _proof, _clock, ...doc }) {
|
261
261
|
await this.ready;
|
262
262
|
const id = _id || 'f' + Math.random().toString(36).slice(2);
|
263
|
+
doc = JSON.parse(JSON.stringify(doc));
|
264
|
+
if (_clock)
|
265
|
+
doc._clock = _clock;
|
263
266
|
await this.runValidation({ _id: id, ...doc });
|
264
|
-
return await this.putToProllyTree({ key: id, value: doc },
|
267
|
+
return await this.putToProllyTree({ key: id, value: doc }, _clock);
|
265
268
|
}
|
266
269
|
/**
|
267
270
|
* Deletes a document from the database
|
package/dist/fireproof.js
CHANGED
package/dist/loader.js
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
import { Browser } from './storage/browser.js';
|
2
2
|
import { Rest } from './storage/rest.js';
|
3
|
-
import { UCAN } from './storage/ucan.js';
|
4
3
|
export const Loader = {
|
5
4
|
appropriate: (name, config = {}) => {
|
6
5
|
if (config.StorageClass) {
|
@@ -9,9 +8,6 @@ export const Loader = {
|
|
9
8
|
if (config.type === 'rest') {
|
10
9
|
return new Rest(name, config);
|
11
10
|
}
|
12
|
-
if (config.type === 'ucan') {
|
13
|
-
return new UCAN(name, config);
|
14
|
-
}
|
15
11
|
return new Browser(name, config);
|
16
12
|
}
|
17
13
|
};
|
package/dist/prolly.js
CHANGED
@@ -280,7 +280,7 @@ export async function root(inBlocks, head, doFull = false) {
|
|
280
280
|
bigPut(nb);
|
281
281
|
}
|
282
282
|
// console.log('root root', newProllyRootNode.constructor.name, newProllyRootNode)
|
283
|
-
return { clockCIDs, node: newProllyRootNode };
|
283
|
+
return { clockCIDs, node: newProllyRootNode, head };
|
284
284
|
}, false);
|
285
285
|
// return { clockCIDs, node: newProllyRootNode }
|
286
286
|
}
|
package/dist/remote.js
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
// when you call database.connect(email)
|
2
|
+
// it will return a promise that resolves when the user is logged in
|
3
|
+
// and sends you an email
|
4
|
+
import { create } from '@web3-storage/w3up-client';
|
5
|
+
import * as w3clock from '@web3-storage/clock/client';
|
6
|
+
import { CID } from 'multiformats';
|
7
|
+
export class Remote {
|
8
|
+
client = null;
|
9
|
+
name = 'unset';
|
10
|
+
config = {};
|
11
|
+
constructor(database, name, config) {
|
12
|
+
this.name = name;
|
13
|
+
this.config = config;
|
14
|
+
this.database = database;
|
15
|
+
}
|
16
|
+
async clock(cid) {
|
17
|
+
// const did = this.client.currentSpace()
|
18
|
+
const agent = this.client.agent();
|
19
|
+
const head = await w3clock.head({ issuer: agent, with: agent.did(), proofs: [] });
|
20
|
+
console.log('head', head, JSON.stringify(head.root.data.ocm.out));
|
21
|
+
const headCids = head.root.data.ocm.out.ok.head;
|
22
|
+
const blocks = await Promise.all([this.database.blocks.get(CID.parse(cid)),
|
23
|
+
...headCids.map(c => this.database.blocks.get(c))]);
|
24
|
+
console.log('blocks', blocks);
|
25
|
+
const adv = await w3clock.advance({ issuer: agent, with: agent.did(), proofs: [] }, CID.parse(cid), { blocks });
|
26
|
+
console.log('adv', adv, JSON.stringify(adv.root.data.ocm.out));
|
27
|
+
return { head, adv };
|
28
|
+
}
|
29
|
+
async connect(email) {
|
30
|
+
try {
|
31
|
+
const client = await create();
|
32
|
+
await client.authorize(email);
|
33
|
+
const claims = await client.capability.access.claim();
|
34
|
+
console.log('claims', claims);
|
35
|
+
const space = await client.createSpace('fp.' + this.name);
|
36
|
+
console.log('space', space);
|
37
|
+
await client.setCurrentSpace(space.did());
|
38
|
+
await client.registerSpace(email);
|
39
|
+
this.client = client;
|
40
|
+
console.log('client', client);
|
41
|
+
}
|
42
|
+
catch (err) {
|
43
|
+
console.error('registration failed: ', err);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
}
|
package/dist/src/fireproof.d.ts
CHANGED
@@ -113,6 +113,7 @@ declare class InnerBlockstore {
|
|
113
113
|
constructor(label: any, parentBlockstore: any);
|
114
114
|
/** @type {Map<string, Uint8Array>} */
|
115
115
|
blocks: Map<string, Uint8Array>;
|
116
|
+
head: any[];
|
116
117
|
lastCid: any;
|
117
118
|
label: string;
|
118
119
|
parentBlockstore: any;
|
@@ -174,7 +175,6 @@ declare class Database {
|
|
174
175
|
*/
|
175
176
|
toJSON(): any;
|
176
177
|
toHeader(): {
|
177
|
-
clock: string[];
|
178
178
|
name: any;
|
179
179
|
index: {
|
180
180
|
key: any;
|
@@ -250,7 +250,7 @@ declare class Database {
|
|
250
250
|
* @memberof Fireproof
|
251
251
|
* @instance
|
252
252
|
*/
|
253
|
-
put({ _id, _proof, ...doc }: any): Promise<{
|
253
|
+
put({ _id, _proof, _clock, ...doc }: any): Promise<{
|
254
254
|
id: string;
|
255
255
|
clock: CID[];
|
256
256
|
}>;
|
package/dist/src/fireproof.js
CHANGED
@@ -38939,10 +38939,11 @@ class Base {
|
|
38939
38939
|
}
|
38940
38940
|
cidMap.clear();
|
38941
38941
|
const blocks = {
|
38942
|
+
head: clock,
|
38942
38943
|
lastCid: clock[0],
|
38943
38944
|
get: cid => allBlocks.get(cid.toString())
|
38944
38945
|
};
|
38945
|
-
console.log('compact', this.instanceId, this.name, blocks.lastCid.toString(), dataCids.length)
|
38946
|
+
// console.log('compact', this.instanceId, this.name, blocks.lastCid.toString(), dataCids.length)
|
38946
38947
|
await this.parkCar(blocks, dataCids);
|
38947
38948
|
}
|
38948
38949
|
|
@@ -38958,11 +38959,11 @@ class Base {
|
|
38958
38959
|
newCar = await blocksToCarBlock(innerBlockstore.lastCid, innerBlockstore);
|
38959
38960
|
}
|
38960
38961
|
// console.log('new car', newCar.cid.toString())
|
38961
|
-
return await this.saveCar(newCar.cid.toString(), newCar.bytes, cids)
|
38962
|
+
return await this.saveCar(newCar.cid.toString(), newCar.bytes, cids, innerBlockstore.head)
|
38962
38963
|
}
|
38963
38964
|
|
38964
|
-
async saveCar (carCid, value, cids) {
|
38965
|
-
const newValetCidCar = await this.updateCarCidMap(carCid, cids);
|
38965
|
+
async saveCar (carCid, value, cids, head = null) {
|
38966
|
+
const newValetCidCar = await this.updateCarCidMap(carCid, cids, head);
|
38966
38967
|
// console.log('writeCars', carCid.toString(), newValetCidCar.cid.toString())
|
38967
38968
|
const carList = [
|
38968
38969
|
{
|
@@ -38984,7 +38985,7 @@ class Base {
|
|
38984
38985
|
return newValetCidCar
|
38985
38986
|
}
|
38986
38987
|
|
38987
|
-
applyHeaders (headers) {
|
38988
|
+
async applyHeaders (headers) {
|
38988
38989
|
// console.log('applyHeaders', headers.index)
|
38989
38990
|
this.headers = headers;
|
38990
38991
|
// console.log('before applied', this.instanceId, this.name, this.keyMaterial, this.valetRootCarCid)
|
@@ -38993,6 +38994,9 @@ class Base {
|
|
38993
38994
|
// console.log('applyHeaders', this.instanceId, this.name, header.key, header.car)
|
38994
38995
|
header.key && this.setKeyMaterial(header.key);
|
38995
38996
|
this.setCarCidMapCarCid(header.car);
|
38997
|
+
const { clock } = await this.readHeaderCar(header.car);
|
38998
|
+
// console.log('stored clock', this.name, branch, clock, header)
|
38999
|
+
header.clock = clock.map(c => c.toString());
|
38996
39000
|
}
|
38997
39001
|
}
|
38998
39002
|
if (!this.valetRootCarCid) {
|
@@ -39013,10 +39017,16 @@ class Base {
|
|
39013
39017
|
const headers = {};
|
39014
39018
|
for (const [branch] of Object.entries(this.config.branches)) {
|
39015
39019
|
const got = await this.loadHeader(branch);
|
39020
|
+
// const carCid = got.car
|
39016
39021
|
// console.log('getHeaders', this.name, branch, got)
|
39022
|
+
// if (got && got.car) {
|
39023
|
+
// const { clock } = await this.readHeaderCar(got.car)
|
39024
|
+
// console.log('stored clock', this.name, branch, clock)
|
39025
|
+
// }
|
39026
|
+
|
39017
39027
|
headers[branch] = got;
|
39018
39028
|
}
|
39019
|
-
this.applyHeaders(headers);
|
39029
|
+
await this.applyHeaders(headers);
|
39020
39030
|
return headers
|
39021
39031
|
}
|
39022
39032
|
|
@@ -39024,9 +39034,14 @@ class Base {
|
|
39024
39034
|
throw new Error('not implemented')
|
39025
39035
|
}
|
39026
39036
|
|
39037
|
+
async getStoredClock (carCid) {
|
39038
|
+
|
39039
|
+
}
|
39040
|
+
|
39027
39041
|
async saveHeader (header) {
|
39042
|
+
// this.clock = header.clock
|
39028
39043
|
// for each branch, save the header
|
39029
|
-
// console.log('saveHeader',
|
39044
|
+
// console.log('saveHeader', header.clock)
|
39030
39045
|
// for (const branch of this.branches) {
|
39031
39046
|
// await this.saveBranchHeader(branch)
|
39032
39047
|
// }
|
@@ -39088,8 +39103,13 @@ class Base {
|
|
39088
39103
|
async mapForIPLDHashmapCarCid (carCid) {
|
39089
39104
|
// console.log('mapForIPLDHashmapCarCid', carCid)
|
39090
39105
|
// todo why is this writeable?
|
39091
|
-
const carMapReader = await this.
|
39092
|
-
|
39106
|
+
const { cars, reader: carMapReader } = await this.readHeaderCar(carCid);
|
39107
|
+
|
39108
|
+
// this.clock = clock
|
39109
|
+
|
39110
|
+
// console.log('mapForIPLDHashmapCarCid', cars)
|
39111
|
+
|
39112
|
+
const indexNode = await load$1(carMapReader, cars, {
|
39093
39113
|
blockHasher: blockOpts$1.hasher,
|
39094
39114
|
blockCodec: blockOpts$1.codec
|
39095
39115
|
});
|
@@ -39101,9 +39121,21 @@ class Base {
|
|
39101
39121
|
return theCarMap
|
39102
39122
|
}
|
39103
39123
|
|
39124
|
+
async readHeaderCar (carCid) {
|
39125
|
+
const carMapReader = await this.getWriteableCarReader(carCid);
|
39126
|
+
// console.log('readHeaderCar', carCid, carMapReader)
|
39127
|
+
// now when we load the root cid from the car, we get our new custom root node
|
39128
|
+
const bytes = await carMapReader.get(carMapReader.root.cid);
|
39129
|
+
const decoded = await decode$5({ bytes, hasher: blockOpts$1.hasher, codec: blockOpts$1.codec });
|
39130
|
+
// @ts-ignore
|
39131
|
+
const { fp: { cars, clock } } = decoded.value;
|
39132
|
+
return { cars, clock, reader: carMapReader }
|
39133
|
+
}
|
39134
|
+
|
39104
39135
|
async getWriteableCarReader (carCid) {
|
39105
39136
|
// console.log('getWriteableCarReader', carCid)
|
39106
39137
|
const carMapReader = await this.getCarReader(carCid);
|
39138
|
+
// console.log('getWriteableCarReader', carCid, carMapReader)
|
39107
39139
|
const theseWriteableBlocks = new VMemoryBlockstore();
|
39108
39140
|
const combinedReader = {
|
39109
39141
|
blocks: theseWriteableBlocks,
|
@@ -39140,12 +39172,16 @@ class Base {
|
|
39140
39172
|
|
39141
39173
|
async getCarReaderImpl (carCid) {
|
39142
39174
|
carCid = carCid.toString();
|
39175
|
+
// console.log('getCarReaderImpl', carCid)
|
39143
39176
|
const carBytes = await this.readCar(carCid);
|
39144
39177
|
// console.log('getCarReader', this.constructor.name, carCid, carBytes.length)
|
39145
39178
|
const reader = await CarReader.fromBytes(carBytes);
|
39179
|
+
// console.log('getCarReader', carCid, reader._header)
|
39146
39180
|
if (this.keyMaterial) {
|
39147
39181
|
const roots = await reader.getRoots();
|
39182
|
+
// let count = 0
|
39148
39183
|
const readerGetWithCodec = async cid => {
|
39184
|
+
// console.log('readerGetWithCodec', count++, cid)
|
39149
39185
|
const got = await reader.get(cid);
|
39150
39186
|
let useCodec = codec;
|
39151
39187
|
if (cid.toString().indexOf('bafy') === 0) {
|
@@ -39202,17 +39238,17 @@ class Base {
|
|
39202
39238
|
|
39203
39239
|
writeCars (cars) {}
|
39204
39240
|
|
39205
|
-
async updateCarCidMap (carCid, cids) {
|
39241
|
+
async updateCarCidMap (carCid, cids, head) {
|
39206
39242
|
// this hydrates the map if it has not been hydrated
|
39207
39243
|
const theCarMap = await this.getCidCarMap();
|
39208
39244
|
for (const cid of cids) {
|
39209
39245
|
theCarMap.set(cid, carCid);
|
39210
39246
|
}
|
39211
39247
|
// todo can we debounce this? -- maybe put it into a queue so we can batch it
|
39212
|
-
return await this.persistCarMap(theCarMap)
|
39248
|
+
return await this.persistCarMap(theCarMap, head)
|
39213
39249
|
}
|
39214
39250
|
|
39215
|
-
async persistCarMap (theCarMap) {
|
39251
|
+
async persistCarMap (theCarMap, head) {
|
39216
39252
|
const ipldLoader = await getEmptyLoader();
|
39217
39253
|
const indexNode = await create$1(ipldLoader, {
|
39218
39254
|
bitWidth: 4,
|
@@ -39225,13 +39261,21 @@ class Base {
|
|
39225
39261
|
await indexNode.set(key, value);
|
39226
39262
|
}
|
39227
39263
|
|
39264
|
+
// console.log('persistCarMap', indexNode.cid, head)
|
39265
|
+
const value = { fp: { cars: indexNode.cid, clock: head } };
|
39266
|
+
const header = await encode$5({ value, hasher: blockOpts$1.hasher, codec: blockOpts$1.codec });
|
39267
|
+
ipldLoader.blocks.put(header.cid, header.bytes);
|
39268
|
+
|
39228
39269
|
let newValetCidCar;
|
39229
39270
|
if (this.keyMaterial) {
|
39230
39271
|
const cids = [...ipldLoader.blocks.blocks.keys()];
|
39231
39272
|
// console.log('persistCarMap', cids)
|
39232
|
-
|
39273
|
+
// store the clock head and a link to the indexNode.cid in a custom root?
|
39274
|
+
|
39275
|
+
newValetCidCar = await blocksToEncryptedCarBlock(header.cid, ipldLoader.blocks, this.keyMaterial, cids);
|
39276
|
+
// then put this carcid into the header / w3clock
|
39233
39277
|
} else {
|
39234
|
-
newValetCidCar = await blocksToCarBlock(
|
39278
|
+
newValetCidCar = await blocksToCarBlock(header.cid, ipldLoader.blocks);
|
39235
39279
|
}
|
39236
39280
|
return newValetCidCar
|
39237
39281
|
}
|
@@ -39366,6 +39410,7 @@ const blocksFromEncryptedCarBlock = async (cid, get, keyMaterial) => {
|
|
39366
39410
|
cache: nocache
|
39367
39411
|
// codec: dagcbor
|
39368
39412
|
})) {
|
39413
|
+
// console.log('decrypted', block.cid.toString())
|
39369
39414
|
decryptedBlocks.push(block);
|
39370
39415
|
cids.add(block.cid.toString());
|
39371
39416
|
}
|
@@ -39376,7 +39421,7 @@ const blocksFromEncryptedCarBlock = async (cid, get, keyMaterial) => {
|
|
39376
39421
|
}
|
39377
39422
|
};
|
39378
39423
|
|
39379
|
-
const defaultConfig$
|
39424
|
+
const defaultConfig$1 = {
|
39380
39425
|
headerKeyPrefix: 'fp.'
|
39381
39426
|
};
|
39382
39427
|
|
@@ -39384,7 +39429,7 @@ const defaultConfig$2 = {
|
|
39384
39429
|
|
39385
39430
|
class Browser extends Base {
|
39386
39431
|
constructor (name, config = {}) {
|
39387
|
-
super(name, Object.assign({}, defaultConfig$
|
39432
|
+
super(name, Object.assign({}, defaultConfig$1, config));
|
39388
39433
|
}
|
39389
39434
|
|
39390
39435
|
withDB = async dbWorkFun => {
|
@@ -40006,13 +40051,13 @@ var browserPonyfill = {
|
|
40006
40051
|
|
40007
40052
|
var fetch = /*@__PURE__*/getDefaultExportFromCjs(browserPonyfillExports);
|
40008
40053
|
|
40009
|
-
const defaultConfig
|
40054
|
+
const defaultConfig = {
|
40010
40055
|
url: 'http://localhost:4000'
|
40011
40056
|
};
|
40012
40057
|
|
40013
40058
|
class Rest extends Base {
|
40014
40059
|
constructor (name, config = {}) {
|
40015
|
-
super(name, Object.assign({}, defaultConfig
|
40060
|
+
super(name, Object.assign({}, defaultConfig, config));
|
40016
40061
|
// console.log('Rest', name, config)
|
40017
40062
|
}
|
40018
40063
|
|
@@ -40064,48 +40109,6 @@ class Rest extends Base {
|
|
40064
40109
|
}
|
40065
40110
|
}
|
40066
40111
|
|
40067
|
-
const defaultConfig = {
|
40068
|
-
upload: () => {},
|
40069
|
-
url: (cid) => `https://${cid}.ipfs.w3s.link/`
|
40070
|
-
};
|
40071
|
-
|
40072
|
-
class UCAN extends Base {
|
40073
|
-
constructor (name, config = {}) {
|
40074
|
-
super(name, Object.assign({}, defaultConfig, config));
|
40075
|
-
}
|
40076
|
-
|
40077
|
-
async writeCars (cars) {
|
40078
|
-
if (this.config.readonly) return
|
40079
|
-
for (const { cid, bytes } of cars) {
|
40080
|
-
const upCid = await this.config.upload(bytes);
|
40081
|
-
console.log('writeCar UCAN', cid, upCid);
|
40082
|
-
// if (!response.ok) throw new Error(`An error occurred: ${response.statusText}`)
|
40083
|
-
}
|
40084
|
-
}
|
40085
|
-
|
40086
|
-
async readCar (carCid) {
|
40087
|
-
const carURL = this.config.url(carCid);
|
40088
|
-
const response = await fetch(carURL);
|
40089
|
-
if (!response.ok) throw new Error(`An error occurred: ${response.statusText}`)
|
40090
|
-
const got = await response.arrayBuffer();
|
40091
|
-
return new Uint8Array(got)
|
40092
|
-
}
|
40093
|
-
|
40094
|
-
async loadHeader (branch = 'main') {
|
40095
|
-
return headerMock.get(branch)
|
40096
|
-
}
|
40097
|
-
|
40098
|
-
async writeHeader (branch, header) {
|
40099
|
-
if (this.config.readonly) return
|
40100
|
-
const pHeader = this.prepareHeader(header);
|
40101
|
-
// console.log('writeHeader rt', branch, pHeader)
|
40102
|
-
|
40103
|
-
headerMock.set(branch, pHeader);
|
40104
|
-
}
|
40105
|
-
}
|
40106
|
-
|
40107
|
-
const headerMock = new Map();
|
40108
|
-
|
40109
40112
|
const Loader = {
|
40110
40113
|
appropriate: (name, config = {}) => {
|
40111
40114
|
if (config.StorageClass) {
|
@@ -40116,10 +40119,6 @@ const Loader = {
|
|
40116
40119
|
return new Rest(name, config)
|
40117
40120
|
}
|
40118
40121
|
|
40119
|
-
if (config.type === 'ucan') {
|
40120
|
-
return new UCAN(name, config)
|
40121
|
-
}
|
40122
|
-
|
40123
40122
|
return new Browser(name, config)
|
40124
40123
|
}
|
40125
40124
|
};
|
@@ -40438,6 +40437,9 @@ const doTransaction = async (label, blockstore, doFun, doSync = true) => {
|
|
40438
40437
|
const innerBlockstore = blockstore.begin(label);
|
40439
40438
|
try {
|
40440
40439
|
const result = await doFun(innerBlockstore);
|
40440
|
+
// console.log('doTransaction', label, 'result', result.head)
|
40441
|
+
if (result && result.head) { innerBlockstore.head = result.head; }
|
40442
|
+
// pass the latest clock head for writing to the valet
|
40441
40443
|
// @ts-ignore
|
40442
40444
|
await blockstore.commit(innerBlockstore, doSync);
|
40443
40445
|
return result
|
@@ -40453,6 +40455,7 @@ const doTransaction = async (label, blockstore, doFun, doSync = true) => {
|
|
40453
40455
|
class InnerBlockstore {
|
40454
40456
|
/** @type {Map<string, Uint8Array>} */
|
40455
40457
|
blocks = new Map()
|
40458
|
+
head = []
|
40456
40459
|
lastCid = null
|
40457
40460
|
label = ''
|
40458
40461
|
parentBlockstore = null
|
@@ -40783,7 +40786,7 @@ async function root (inBlocks, head, doFull = false) {
|
|
40783
40786
|
bigPut(nb);
|
40784
40787
|
}
|
40785
40788
|
// console.log('root root', newProllyRootNode.constructor.name, newProllyRootNode)
|
40786
|
-
return { clockCIDs, node: newProllyRootNode }
|
40789
|
+
return { clockCIDs, node: newProllyRootNode, head }
|
40787
40790
|
},
|
40788
40791
|
false
|
40789
40792
|
)
|
@@ -41750,7 +41753,7 @@ class Database {
|
|
41750
41753
|
|
41751
41754
|
toHeader () {
|
41752
41755
|
return {
|
41753
|
-
clock: this.clockToJSON(),
|
41756
|
+
// clock: this.clockToJSON(),
|
41754
41757
|
name: this.name,
|
41755
41758
|
index: {
|
41756
41759
|
key: this.indexBlocks.valet?.primary.keyMaterial,
|
@@ -41935,11 +41938,13 @@ class Database {
|
|
41935
41938
|
* @memberof Fireproof
|
41936
41939
|
* @instance
|
41937
41940
|
*/
|
41938
|
-
async put ({ _id, _proof, ...doc }) {
|
41941
|
+
async put ({ _id, _proof, _clock, ...doc }) {
|
41939
41942
|
await this.ready;
|
41940
41943
|
const id = _id || 'f' + Math.random().toString(36).slice(2);
|
41944
|
+
doc = JSON.parse(JSON.stringify(doc));
|
41945
|
+
if (_clock) doc._clock = _clock;
|
41941
41946
|
await this.runValidation({ _id: id, ...doc });
|
41942
|
-
return await this.putToProllyTree({ key: id, value: doc },
|
41947
|
+
return await this.putToProllyTree({ key: id, value: doc }, _clock)
|
41943
41948
|
}
|
41944
41949
|
|
41945
41950
|
/**
|
@@ -44283,6 +44288,7 @@ class Fireproof {
|
|
44283
44288
|
|
44284
44289
|
static snapshot (database, clock) {
|
44285
44290
|
const definition = database.toJSON();
|
44291
|
+
definition.clock = database.clockToJSON();
|
44286
44292
|
if (clock) {
|
44287
44293
|
definition.clock = clock.map(c => parseCID(c));
|
44288
44294
|
definition.indexes.forEach(index => {
|