@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/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 => {
|