@fireproof/core 0.7.3-dev.1 → 0.8.0-dev
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/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/src/fireproof.mjs
CHANGED
@@ -38937,10 +38937,11 @@ class Base {
|
|
38937
38937
|
}
|
38938
38938
|
cidMap.clear();
|
38939
38939
|
const blocks = {
|
38940
|
+
head: clock,
|
38940
38941
|
lastCid: clock[0],
|
38941
38942
|
get: cid => allBlocks.get(cid.toString())
|
38942
38943
|
};
|
38943
|
-
console.log('compact', this.instanceId, this.name, blocks.lastCid.toString(), dataCids.length)
|
38944
|
+
// console.log('compact', this.instanceId, this.name, blocks.lastCid.toString(), dataCids.length)
|
38944
38945
|
await this.parkCar(blocks, dataCids);
|
38945
38946
|
}
|
38946
38947
|
|
@@ -38956,11 +38957,11 @@ class Base {
|
|
38956
38957
|
newCar = await blocksToCarBlock(innerBlockstore.lastCid, innerBlockstore);
|
38957
38958
|
}
|
38958
38959
|
// console.log('new car', newCar.cid.toString())
|
38959
|
-
return await this.saveCar(newCar.cid.toString(), newCar.bytes, cids)
|
38960
|
+
return await this.saveCar(newCar.cid.toString(), newCar.bytes, cids, innerBlockstore.head)
|
38960
38961
|
}
|
38961
38962
|
|
38962
|
-
async saveCar (carCid, value, cids) {
|
38963
|
-
const newValetCidCar = await this.updateCarCidMap(carCid, cids);
|
38963
|
+
async saveCar (carCid, value, cids, head = null) {
|
38964
|
+
const newValetCidCar = await this.updateCarCidMap(carCid, cids, head);
|
38964
38965
|
// console.log('writeCars', carCid.toString(), newValetCidCar.cid.toString())
|
38965
38966
|
const carList = [
|
38966
38967
|
{
|
@@ -38982,7 +38983,7 @@ class Base {
|
|
38982
38983
|
return newValetCidCar
|
38983
38984
|
}
|
38984
38985
|
|
38985
|
-
applyHeaders (headers) {
|
38986
|
+
async applyHeaders (headers) {
|
38986
38987
|
// console.log('applyHeaders', headers.index)
|
38987
38988
|
this.headers = headers;
|
38988
38989
|
// console.log('before applied', this.instanceId, this.name, this.keyMaterial, this.valetRootCarCid)
|
@@ -38991,6 +38992,9 @@ class Base {
|
|
38991
38992
|
// console.log('applyHeaders', this.instanceId, this.name, header.key, header.car)
|
38992
38993
|
header.key && this.setKeyMaterial(header.key);
|
38993
38994
|
this.setCarCidMapCarCid(header.car);
|
38995
|
+
const { clock } = await this.readHeaderCar(header.car);
|
38996
|
+
// console.log('stored clock', this.name, branch, clock, header)
|
38997
|
+
header.clock = clock.map(c => c.toString());
|
38994
38998
|
}
|
38995
38999
|
}
|
38996
39000
|
if (!this.valetRootCarCid) {
|
@@ -39011,10 +39015,16 @@ class Base {
|
|
39011
39015
|
const headers = {};
|
39012
39016
|
for (const [branch] of Object.entries(this.config.branches)) {
|
39013
39017
|
const got = await this.loadHeader(branch);
|
39018
|
+
// const carCid = got.car
|
39014
39019
|
// console.log('getHeaders', this.name, branch, got)
|
39020
|
+
// if (got && got.car) {
|
39021
|
+
// const { clock } = await this.readHeaderCar(got.car)
|
39022
|
+
// console.log('stored clock', this.name, branch, clock)
|
39023
|
+
// }
|
39024
|
+
|
39015
39025
|
headers[branch] = got;
|
39016
39026
|
}
|
39017
|
-
this.applyHeaders(headers);
|
39027
|
+
await this.applyHeaders(headers);
|
39018
39028
|
return headers
|
39019
39029
|
}
|
39020
39030
|
|
@@ -39022,9 +39032,14 @@ class Base {
|
|
39022
39032
|
throw new Error('not implemented')
|
39023
39033
|
}
|
39024
39034
|
|
39035
|
+
async getStoredClock (carCid) {
|
39036
|
+
|
39037
|
+
}
|
39038
|
+
|
39025
39039
|
async saveHeader (header) {
|
39040
|
+
// this.clock = header.clock
|
39026
39041
|
// for each branch, save the header
|
39027
|
-
// console.log('saveHeader',
|
39042
|
+
// console.log('saveHeader', header.clock)
|
39028
39043
|
// for (const branch of this.branches) {
|
39029
39044
|
// await this.saveBranchHeader(branch)
|
39030
39045
|
// }
|
@@ -39086,8 +39101,13 @@ class Base {
|
|
39086
39101
|
async mapForIPLDHashmapCarCid (carCid) {
|
39087
39102
|
// console.log('mapForIPLDHashmapCarCid', carCid)
|
39088
39103
|
// todo why is this writeable?
|
39089
|
-
const carMapReader = await this.
|
39090
|
-
|
39104
|
+
const { cars, reader: carMapReader } = await this.readHeaderCar(carCid);
|
39105
|
+
|
39106
|
+
// this.clock = clock
|
39107
|
+
|
39108
|
+
// console.log('mapForIPLDHashmapCarCid', cars)
|
39109
|
+
|
39110
|
+
const indexNode = await load$1(carMapReader, cars, {
|
39091
39111
|
blockHasher: blockOpts$1.hasher,
|
39092
39112
|
blockCodec: blockOpts$1.codec
|
39093
39113
|
});
|
@@ -39099,9 +39119,21 @@ class Base {
|
|
39099
39119
|
return theCarMap
|
39100
39120
|
}
|
39101
39121
|
|
39122
|
+
async readHeaderCar (carCid) {
|
39123
|
+
const carMapReader = await this.getWriteableCarReader(carCid);
|
39124
|
+
// console.log('readHeaderCar', carCid, carMapReader)
|
39125
|
+
// now when we load the root cid from the car, we get our new custom root node
|
39126
|
+
const bytes = await carMapReader.get(carMapReader.root.cid);
|
39127
|
+
const decoded = await decode$5({ bytes, hasher: blockOpts$1.hasher, codec: blockOpts$1.codec });
|
39128
|
+
// @ts-ignore
|
39129
|
+
const { fp: { cars, clock } } = decoded.value;
|
39130
|
+
return { cars, clock, reader: carMapReader }
|
39131
|
+
}
|
39132
|
+
|
39102
39133
|
async getWriteableCarReader (carCid) {
|
39103
39134
|
// console.log('getWriteableCarReader', carCid)
|
39104
39135
|
const carMapReader = await this.getCarReader(carCid);
|
39136
|
+
// console.log('getWriteableCarReader', carCid, carMapReader)
|
39105
39137
|
const theseWriteableBlocks = new VMemoryBlockstore();
|
39106
39138
|
const combinedReader = {
|
39107
39139
|
blocks: theseWriteableBlocks,
|
@@ -39138,12 +39170,16 @@ class Base {
|
|
39138
39170
|
|
39139
39171
|
async getCarReaderImpl (carCid) {
|
39140
39172
|
carCid = carCid.toString();
|
39173
|
+
// console.log('getCarReaderImpl', carCid)
|
39141
39174
|
const carBytes = await this.readCar(carCid);
|
39142
39175
|
// console.log('getCarReader', this.constructor.name, carCid, carBytes.length)
|
39143
39176
|
const reader = await CarReader.fromBytes(carBytes);
|
39177
|
+
// console.log('getCarReader', carCid, reader._header)
|
39144
39178
|
if (this.keyMaterial) {
|
39145
39179
|
const roots = await reader.getRoots();
|
39180
|
+
// let count = 0
|
39146
39181
|
const readerGetWithCodec = async cid => {
|
39182
|
+
// console.log('readerGetWithCodec', count++, cid)
|
39147
39183
|
const got = await reader.get(cid);
|
39148
39184
|
let useCodec = codec;
|
39149
39185
|
if (cid.toString().indexOf('bafy') === 0) {
|
@@ -39200,17 +39236,17 @@ class Base {
|
|
39200
39236
|
|
39201
39237
|
writeCars (cars) {}
|
39202
39238
|
|
39203
|
-
async updateCarCidMap (carCid, cids) {
|
39239
|
+
async updateCarCidMap (carCid, cids, head) {
|
39204
39240
|
// this hydrates the map if it has not been hydrated
|
39205
39241
|
const theCarMap = await this.getCidCarMap();
|
39206
39242
|
for (const cid of cids) {
|
39207
39243
|
theCarMap.set(cid, carCid);
|
39208
39244
|
}
|
39209
39245
|
// todo can we debounce this? -- maybe put it into a queue so we can batch it
|
39210
|
-
return await this.persistCarMap(theCarMap)
|
39246
|
+
return await this.persistCarMap(theCarMap, head)
|
39211
39247
|
}
|
39212
39248
|
|
39213
|
-
async persistCarMap (theCarMap) {
|
39249
|
+
async persistCarMap (theCarMap, head) {
|
39214
39250
|
const ipldLoader = await getEmptyLoader();
|
39215
39251
|
const indexNode = await create$1(ipldLoader, {
|
39216
39252
|
bitWidth: 4,
|
@@ -39223,13 +39259,21 @@ class Base {
|
|
39223
39259
|
await indexNode.set(key, value);
|
39224
39260
|
}
|
39225
39261
|
|
39262
|
+
// console.log('persistCarMap', indexNode.cid, head)
|
39263
|
+
const value = { fp: { cars: indexNode.cid, clock: head } };
|
39264
|
+
const header = await encode$5({ value, hasher: blockOpts$1.hasher, codec: blockOpts$1.codec });
|
39265
|
+
ipldLoader.blocks.put(header.cid, header.bytes);
|
39266
|
+
|
39226
39267
|
let newValetCidCar;
|
39227
39268
|
if (this.keyMaterial) {
|
39228
39269
|
const cids = [...ipldLoader.blocks.blocks.keys()];
|
39229
39270
|
// console.log('persistCarMap', cids)
|
39230
|
-
|
39271
|
+
// store the clock head and a link to the indexNode.cid in a custom root?
|
39272
|
+
|
39273
|
+
newValetCidCar = await blocksToEncryptedCarBlock(header.cid, ipldLoader.blocks, this.keyMaterial, cids);
|
39274
|
+
// then put this carcid into the header / w3clock
|
39231
39275
|
} else {
|
39232
|
-
newValetCidCar = await blocksToCarBlock(
|
39276
|
+
newValetCidCar = await blocksToCarBlock(header.cid, ipldLoader.blocks);
|
39233
39277
|
}
|
39234
39278
|
return newValetCidCar
|
39235
39279
|
}
|
@@ -39364,6 +39408,7 @@ const blocksFromEncryptedCarBlock = async (cid, get, keyMaterial) => {
|
|
39364
39408
|
cache: nocache
|
39365
39409
|
// codec: dagcbor
|
39366
39410
|
})) {
|
39411
|
+
// console.log('decrypted', block.cid.toString())
|
39367
39412
|
decryptedBlocks.push(block);
|
39368
39413
|
cids.add(block.cid.toString());
|
39369
39414
|
}
|
@@ -39374,7 +39419,7 @@ const blocksFromEncryptedCarBlock = async (cid, get, keyMaterial) => {
|
|
39374
39419
|
}
|
39375
39420
|
};
|
39376
39421
|
|
39377
|
-
const defaultConfig$
|
39422
|
+
const defaultConfig$1 = {
|
39378
39423
|
headerKeyPrefix: 'fp.'
|
39379
39424
|
};
|
39380
39425
|
|
@@ -39382,7 +39427,7 @@ const defaultConfig$2 = {
|
|
39382
39427
|
|
39383
39428
|
class Browser extends Base {
|
39384
39429
|
constructor (name, config = {}) {
|
39385
|
-
super(name, Object.assign({}, defaultConfig$
|
39430
|
+
super(name, Object.assign({}, defaultConfig$1, config));
|
39386
39431
|
}
|
39387
39432
|
|
39388
39433
|
withDB = async dbWorkFun => {
|
@@ -40004,13 +40049,13 @@ var browserPonyfill = {
|
|
40004
40049
|
|
40005
40050
|
var fetch = /*@__PURE__*/getDefaultExportFromCjs(browserPonyfillExports);
|
40006
40051
|
|
40007
|
-
const defaultConfig
|
40052
|
+
const defaultConfig = {
|
40008
40053
|
url: 'http://localhost:4000'
|
40009
40054
|
};
|
40010
40055
|
|
40011
40056
|
class Rest extends Base {
|
40012
40057
|
constructor (name, config = {}) {
|
40013
|
-
super(name, Object.assign({}, defaultConfig
|
40058
|
+
super(name, Object.assign({}, defaultConfig, config));
|
40014
40059
|
// console.log('Rest', name, config)
|
40015
40060
|
}
|
40016
40061
|
|
@@ -40062,48 +40107,6 @@ class Rest extends Base {
|
|
40062
40107
|
}
|
40063
40108
|
}
|
40064
40109
|
|
40065
|
-
const defaultConfig = {
|
40066
|
-
upload: () => {},
|
40067
|
-
url: (cid) => `https://${cid}.ipfs.w3s.link/`
|
40068
|
-
};
|
40069
|
-
|
40070
|
-
class UCAN extends Base {
|
40071
|
-
constructor (name, config = {}) {
|
40072
|
-
super(name, Object.assign({}, defaultConfig, config));
|
40073
|
-
}
|
40074
|
-
|
40075
|
-
async writeCars (cars) {
|
40076
|
-
if (this.config.readonly) return
|
40077
|
-
for (const { cid, bytes } of cars) {
|
40078
|
-
const upCid = await this.config.upload(bytes);
|
40079
|
-
console.log('writeCar UCAN', cid, upCid);
|
40080
|
-
// if (!response.ok) throw new Error(`An error occurred: ${response.statusText}`)
|
40081
|
-
}
|
40082
|
-
}
|
40083
|
-
|
40084
|
-
async readCar (carCid) {
|
40085
|
-
const carURL = this.config.url(carCid);
|
40086
|
-
const response = await fetch(carURL);
|
40087
|
-
if (!response.ok) throw new Error(`An error occurred: ${response.statusText}`)
|
40088
|
-
const got = await response.arrayBuffer();
|
40089
|
-
return new Uint8Array(got)
|
40090
|
-
}
|
40091
|
-
|
40092
|
-
async loadHeader (branch = 'main') {
|
40093
|
-
return headerMock.get(branch)
|
40094
|
-
}
|
40095
|
-
|
40096
|
-
async writeHeader (branch, header) {
|
40097
|
-
if (this.config.readonly) return
|
40098
|
-
const pHeader = this.prepareHeader(header);
|
40099
|
-
// console.log('writeHeader rt', branch, pHeader)
|
40100
|
-
|
40101
|
-
headerMock.set(branch, pHeader);
|
40102
|
-
}
|
40103
|
-
}
|
40104
|
-
|
40105
|
-
const headerMock = new Map();
|
40106
|
-
|
40107
40110
|
const Loader = {
|
40108
40111
|
appropriate: (name, config = {}) => {
|
40109
40112
|
if (config.StorageClass) {
|
@@ -40114,10 +40117,6 @@ const Loader = {
|
|
40114
40117
|
return new Rest(name, config)
|
40115
40118
|
}
|
40116
40119
|
|
40117
|
-
if (config.type === 'ucan') {
|
40118
|
-
return new UCAN(name, config)
|
40119
|
-
}
|
40120
|
-
|
40121
40120
|
return new Browser(name, config)
|
40122
40121
|
}
|
40123
40122
|
};
|
@@ -40436,6 +40435,9 @@ const doTransaction = async (label, blockstore, doFun, doSync = true) => {
|
|
40436
40435
|
const innerBlockstore = blockstore.begin(label);
|
40437
40436
|
try {
|
40438
40437
|
const result = await doFun(innerBlockstore);
|
40438
|
+
// console.log('doTransaction', label, 'result', result.head)
|
40439
|
+
if (result && result.head) { innerBlockstore.head = result.head; }
|
40440
|
+
// pass the latest clock head for writing to the valet
|
40439
40441
|
// @ts-ignore
|
40440
40442
|
await blockstore.commit(innerBlockstore, doSync);
|
40441
40443
|
return result
|
@@ -40451,6 +40453,7 @@ const doTransaction = async (label, blockstore, doFun, doSync = true) => {
|
|
40451
40453
|
class InnerBlockstore {
|
40452
40454
|
/** @type {Map<string, Uint8Array>} */
|
40453
40455
|
blocks = new Map()
|
40456
|
+
head = []
|
40454
40457
|
lastCid = null
|
40455
40458
|
label = ''
|
40456
40459
|
parentBlockstore = null
|
@@ -40781,7 +40784,7 @@ async function root (inBlocks, head, doFull = false) {
|
|
40781
40784
|
bigPut(nb);
|
40782
40785
|
}
|
40783
40786
|
// console.log('root root', newProllyRootNode.constructor.name, newProllyRootNode)
|
40784
|
-
return { clockCIDs, node: newProllyRootNode }
|
40787
|
+
return { clockCIDs, node: newProllyRootNode, head }
|
40785
40788
|
},
|
40786
40789
|
false
|
40787
40790
|
)
|
@@ -41748,7 +41751,7 @@ class Database {
|
|
41748
41751
|
|
41749
41752
|
toHeader () {
|
41750
41753
|
return {
|
41751
|
-
clock: this.clockToJSON(),
|
41754
|
+
// clock: this.clockToJSON(),
|
41752
41755
|
name: this.name,
|
41753
41756
|
index: {
|
41754
41757
|
key: this.indexBlocks.valet?.primary.keyMaterial,
|
@@ -41933,11 +41936,13 @@ class Database {
|
|
41933
41936
|
* @memberof Fireproof
|
41934
41937
|
* @instance
|
41935
41938
|
*/
|
41936
|
-
async put ({ _id, _proof, ...doc }) {
|
41939
|
+
async put ({ _id, _proof, _clock, ...doc }) {
|
41937
41940
|
await this.ready;
|
41938
41941
|
const id = _id || 'f' + Math.random().toString(36).slice(2);
|
41942
|
+
doc = JSON.parse(JSON.stringify(doc));
|
41943
|
+
if (_clock) doc._clock = _clock;
|
41939
41944
|
await this.runValidation({ _id: id, ...doc });
|
41940
|
-
return await this.putToProllyTree({ key: id, value: doc },
|
41945
|
+
return await this.putToProllyTree({ key: id, value: doc }, _clock)
|
41941
41946
|
}
|
41942
41947
|
|
41943
41948
|
/**
|
@@ -44281,6 +44286,7 @@ class Fireproof {
|
|
44281
44286
|
|
44282
44287
|
static snapshot (database, clock) {
|
44283
44288
|
const definition = database.toJSON();
|
44289
|
+
definition.clock = database.clockToJSON();
|
44284
44290
|
if (clock) {
|
44285
44291
|
definition.clock = clock.map(c => parseCID(c));
|
44286
44292
|
definition.indexes.forEach(index => {
|