@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.
@@ -91,10 +91,11 @@ export class Base {
91
91
  }
92
92
  cidMap.clear();
93
93
  const blocks = {
94
+ head: clock,
94
95
  lastCid: clock[0],
95
96
  get: cid => allBlocks.get(cid.toString())
96
97
  };
97
- console.log('compact', this.instanceId, this.name, blocks.lastCid.toString(), dataCids.length);
98
+ // console.log('compact', this.instanceId, this.name, blocks.lastCid.toString(), dataCids.length)
98
99
  await this.parkCar(blocks, dataCids);
99
100
  }
100
101
  async parkCar(innerBlockstore, cids) {
@@ -111,10 +112,10 @@ export class Base {
111
112
  newCar = await blocksToCarBlock(innerBlockstore.lastCid, innerBlockstore);
112
113
  }
113
114
  // console.log('new car', newCar.cid.toString())
114
- return await this.saveCar(newCar.cid.toString(), newCar.bytes, cids);
115
+ return await this.saveCar(newCar.cid.toString(), newCar.bytes, cids, innerBlockstore.head);
115
116
  }
116
- async saveCar(carCid, value, cids) {
117
- const newValetCidCar = await this.updateCarCidMap(carCid, cids);
117
+ async saveCar(carCid, value, cids, head = null) {
118
+ const newValetCidCar = await this.updateCarCidMap(carCid, cids, head);
118
119
  // console.log('writeCars', carCid.toString(), newValetCidCar.cid.toString())
119
120
  const carList = [
120
121
  {
@@ -134,7 +135,7 @@ export class Base {
134
135
  // console.trace('saved car', this.instanceId, this.name, newValetCidCar.cid.toString())
135
136
  return newValetCidCar;
136
137
  }
137
- applyHeaders(headers) {
138
+ async applyHeaders(headers) {
138
139
  // console.log('applyHeaders', headers.index)
139
140
  this.headers = headers;
140
141
  // console.log('before applied', this.instanceId, this.name, this.keyMaterial, this.valetRootCarCid)
@@ -143,6 +144,9 @@ export class Base {
143
144
  // console.log('applyHeaders', this.instanceId, this.name, header.key, header.car)
144
145
  header.key && this.setKeyMaterial(header.key);
145
146
  this.setCarCidMapCarCid(header.car);
147
+ const { clock } = await this.readHeaderCar(header.car);
148
+ // console.log('stored clock', this.name, branch, clock, header)
149
+ header.clock = clock.map(c => c.toString());
146
150
  }
147
151
  }
148
152
  if (!this.valetRootCarCid) {
@@ -163,18 +167,28 @@ export class Base {
163
167
  const headers = {};
164
168
  for (const [branch] of Object.entries(this.config.branches)) {
165
169
  const got = await this.loadHeader(branch);
170
+ // const carCid = got.car
166
171
  // console.log('getHeaders', this.name, branch, got)
172
+ // if (got && got.car) {
173
+ // const { clock } = await this.readHeaderCar(got.car)
174
+ // console.log('stored clock', this.name, branch, clock)
175
+ // }
167
176
  headers[branch] = got;
168
177
  }
169
- this.applyHeaders(headers);
178
+ await this.applyHeaders(headers);
170
179
  return headers;
171
180
  }
172
181
  loadHeader(branch = 'main') {
173
- throw new Error('not implemented');
182
+ if (NOT_IMPL)
183
+ throw new Error('not implemented');
184
+ return {};
185
+ }
186
+ async getStoredClock(carCid) {
174
187
  }
175
188
  async saveHeader(header) {
189
+ // this.clock = header.clock
176
190
  // for each branch, save the header
177
- // console.log('saveHeader', this.config.branches, header)
191
+ // console.log('saveHeader', header.clock)
178
192
  // for (const branch of this.branches) {
179
193
  // await this.saveBranchHeader(branch)
180
194
  // }
@@ -233,8 +247,10 @@ export class Base {
233
247
  async mapForIPLDHashmapCarCid(carCid) {
234
248
  // console.log('mapForIPLDHashmapCarCid', carCid)
235
249
  // todo why is this writeable?
236
- const carMapReader = await this.getWriteableCarReader(carCid);
237
- const indexNode = await load(carMapReader, carMapReader.root.cid, {
250
+ const { cars, reader: carMapReader } = await this.readHeaderCar(carCid);
251
+ // this.clock = clock
252
+ // console.log('mapForIPLDHashmapCarCid', cars)
253
+ const indexNode = await load(carMapReader, cars, {
238
254
  blockHasher: blockOpts.hasher,
239
255
  blockCodec: blockOpts.codec
240
256
  });
@@ -245,9 +261,20 @@ export class Base {
245
261
  }
246
262
  return theCarMap;
247
263
  }
264
+ async readHeaderCar(carCid) {
265
+ const carMapReader = await this.getWriteableCarReader(carCid);
266
+ // console.log('readHeaderCar', carCid, carMapReader)
267
+ // now when we load the root cid from the car, we get our new custom root node
268
+ const bytes = await carMapReader.get(carMapReader.root.cid);
269
+ const decoded = await Block.decode({ bytes, hasher: blockOpts.hasher, codec: blockOpts.codec });
270
+ // @ts-ignore
271
+ const { fp: { cars, clock } } = decoded.value;
272
+ return { cars, clock, reader: carMapReader };
273
+ }
248
274
  async getWriteableCarReader(carCid) {
249
275
  // console.log('getWriteableCarReader', carCid)
250
276
  const carMapReader = await this.getCarReader(carCid);
277
+ // console.log('getWriteableCarReader', carCid, carMapReader)
251
278
  const theseWriteableBlocks = new VMemoryBlockstore();
252
279
  const combinedReader = {
253
280
  blocks: theseWriteableBlocks,
@@ -283,12 +310,16 @@ export class Base {
283
310
  }
284
311
  async getCarReaderImpl(carCid) {
285
312
  carCid = carCid.toString();
313
+ // console.log('getCarReaderImpl', carCid)
286
314
  const carBytes = await this.readCar(carCid);
287
315
  // console.log('getCarReader', this.constructor.name, carCid, carBytes.length)
288
316
  const reader = await CarReader.fromBytes(carBytes);
317
+ // console.log('getCarReader', carCid, reader._header)
289
318
  if (this.keyMaterial) {
290
319
  const roots = await reader.getRoots();
320
+ // let count = 0
291
321
  const readerGetWithCodec = async (cid) => {
322
+ // console.log('readerGetWithCodec', count++, cid)
292
323
  const got = await reader.get(cid);
293
324
  let useCodec = codec;
294
325
  if (cid.toString().indexOf('bafy') === 0) {
@@ -343,16 +374,16 @@ export class Base {
343
374
  }
344
375
  }
345
376
  writeCars(cars) { }
346
- async updateCarCidMap(carCid, cids) {
377
+ async updateCarCidMap(carCid, cids, head) {
347
378
  // this hydrates the map if it has not been hydrated
348
379
  const theCarMap = await this.getCidCarMap();
349
380
  for (const cid of cids) {
350
381
  theCarMap.set(cid, carCid);
351
382
  }
352
383
  // todo can we debounce this? -- maybe put it into a queue so we can batch it
353
- return await this.persistCarMap(theCarMap);
384
+ return await this.persistCarMap(theCarMap, head);
354
385
  }
355
- async persistCarMap(theCarMap) {
386
+ async persistCarMap(theCarMap, head) {
356
387
  const ipldLoader = await getEmptyLoader();
357
388
  const indexNode = await create(ipldLoader, {
358
389
  bitWidth: 4,
@@ -363,14 +394,20 @@ export class Base {
363
394
  for (const [key, value] of theCarMap.entries()) {
364
395
  await indexNode.set(key, value);
365
396
  }
397
+ // console.log('persistCarMap', indexNode.cid, head)
398
+ const value = { fp: { cars: indexNode.cid, clock: head } };
399
+ const header = await Block.encode({ value, hasher: blockOpts.hasher, codec: blockOpts.codec });
400
+ ipldLoader.blocks.put(header.cid, header.bytes);
366
401
  let newValetCidCar;
367
402
  if (this.keyMaterial) {
368
403
  const cids = [...ipldLoader.blocks.blocks.keys()];
369
404
  // console.log('persistCarMap', cids)
370
- newValetCidCar = await blocksToEncryptedCarBlock(indexNode.cid, ipldLoader.blocks, this.keyMaterial, cids);
405
+ // store the clock head and a link to the indexNode.cid in a custom root?
406
+ newValetCidCar = await blocksToEncryptedCarBlock(header.cid, ipldLoader.blocks, this.keyMaterial, cids);
407
+ // then put this carcid into the header / w3clock
371
408
  }
372
409
  else {
373
- newValetCidCar = await blocksToCarBlock(indexNode.cid, ipldLoader.blocks);
410
+ newValetCidCar = await blocksToCarBlock(header.cid, ipldLoader.blocks);
374
411
  }
375
412
  return newValetCidCar;
376
413
  }
@@ -497,6 +534,7 @@ export const blocksFromEncryptedCarBlock = async (cid, get, keyMaterial) => {
497
534
  cache
498
535
  // codec: dagcbor
499
536
  })) {
537
+ // console.log('decrypted', block.cid.toString())
500
538
  decryptedBlocks.push(block);
501
539
  cids.add(block.cid.toString());
502
540
  }
@@ -1,39 +0,0 @@
1
- import fetch from 'cross-fetch';
2
- import { Base } from './base.js';
3
- const defaultConfig = {
4
- upload: () => { },
5
- url: (cid) => `https://${cid}.ipfs.w3s.link/`
6
- };
7
- export class UCAN extends Base {
8
- constructor(name, config = {}) {
9
- super(name, Object.assign({}, defaultConfig, config));
10
- }
11
- async writeCars(cars) {
12
- if (this.config.readonly)
13
- return;
14
- for (const { cid, bytes } of cars) {
15
- const upCid = await this.config.upload(bytes);
16
- console.log('writeCar UCAN', cid, upCid);
17
- // if (!response.ok) throw new Error(`An error occurred: ${response.statusText}`)
18
- }
19
- }
20
- async readCar(carCid) {
21
- const carURL = this.config.url(carCid);
22
- const response = await fetch(carURL);
23
- if (!response.ok)
24
- throw new Error(`An error occurred: ${response.statusText}`);
25
- const got = await response.arrayBuffer();
26
- return new Uint8Array(got);
27
- }
28
- async loadHeader(branch = 'main') {
29
- return headerMock.get(branch);
30
- }
31
- async writeHeader(branch, header) {
32
- if (this.config.readonly)
33
- return;
34
- const pHeader = this.prepareHeader(header);
35
- // console.log('writeHeader rt', branch, pHeader)
36
- headerMock.set(branch, pHeader);
37
- }
38
- }
39
- const headerMock = new Map();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fireproof/core",
3
- "version": "0.7.3-dev.1",
3
+ "version": "0.8.0-dev",
4
4
  "description": "Live data for React, accelerated by proofs, powered by IPFS",
5
5
  "main": "dist/src/fireproof.js",
6
6
  "module": "dist/src/fireproof.mjs",
@@ -42,10 +42,6 @@
42
42
  "@ipld/car": "^5.1.0",
43
43
  "@ipld/dag-cbor": "^9.0.0",
44
44
  "@jsonlines/core": "^1.0.2",
45
- "@ucanto/principal": "^8.0.0",
46
- "@ucanto/server": "^8.0.1",
47
- "@ucanto/transport": "^8.0.0",
48
- "@ucanto/validator": "^8.0.0",
49
45
  "async": "^3.2.4",
50
46
  "charwise": "^3.0.1",
51
47
  "cross-fetch": "^3.1.6",
package/src/blockstore.js CHANGED
@@ -221,6 +221,9 @@ export const doTransaction = async (label, blockstore, doFun, doSync = true) =>
221
221
  const innerBlockstore = blockstore.begin(label)
222
222
  try {
223
223
  const result = await doFun(innerBlockstore)
224
+ // console.log('doTransaction', label, 'result', result.head)
225
+ if (result && result.head) { innerBlockstore.head = result.head }
226
+ // pass the latest clock head for writing to the valet
224
227
  // @ts-ignore
225
228
  await blockstore.commit(innerBlockstore, doSync)
226
229
  return result
@@ -236,6 +239,7 @@ export const doTransaction = async (label, blockstore, doFun, doSync = true) =>
236
239
  export class InnerBlockstore {
237
240
  /** @type {Map<string, Uint8Array>} */
238
241
  blocks = new Map()
242
+ head = []
239
243
  lastCid = null
240
244
  label = ''
241
245
  parentBlockstore = null
package/src/database.js CHANGED
@@ -92,7 +92,7 @@ export class Database {
92
92
 
93
93
  toHeader () {
94
94
  return {
95
- clock: this.clockToJSON(),
95
+ // clock: this.clockToJSON(),
96
96
  name: this.name,
97
97
  index: {
98
98
  key: this.indexBlocks.valet?.primary.keyMaterial,
@@ -277,11 +277,13 @@ export class Database {
277
277
  * @memberof Fireproof
278
278
  * @instance
279
279
  */
280
- async put ({ _id, _proof, ...doc }) {
280
+ async put ({ _id, _proof, _clock, ...doc }) {
281
281
  await this.ready
282
282
  const id = _id || 'f' + Math.random().toString(36).slice(2)
283
+ doc = JSON.parse(JSON.stringify(doc))
284
+ if (_clock) doc._clock = _clock
283
285
  await this.runValidation({ _id: id, ...doc })
284
- return await this.putToProllyTree({ key: id, value: doc }, doc._clock)
286
+ return await this.putToProllyTree({ key: id, value: doc }, _clock)
285
287
  }
286
288
 
287
289
  /**
package/src/fireproof.js CHANGED
@@ -62,6 +62,7 @@ export class Fireproof {
62
62
 
63
63
  static snapshot (database, clock) {
64
64
  const definition = database.toJSON()
65
+ definition.clock = database.clockToJSON()
65
66
  if (clock) {
66
67
  definition.clock = clock.map(c => parseCID(c))
67
68
  definition.indexes.forEach(index => {
package/src/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
 
5
4
  export const Loader = {
6
5
  appropriate: (name, config = {}) => {
@@ -12,10 +11,6 @@ export const Loader = {
12
11
  return new Rest(name, config)
13
12
  }
14
13
 
15
- if (config.type === 'ucan') {
16
- return new UCAN(name, config)
17
- }
18
-
19
14
  return new Browser(name, config)
20
15
  }
21
16
  }
package/src/prolly.js CHANGED
@@ -307,7 +307,7 @@ export async function root (inBlocks, head, doFull = false) {
307
307
  bigPut(nb)
308
308
  }
309
309
  // console.log('root root', newProllyRootNode.constructor.name, newProllyRootNode)
310
- return { clockCIDs, node: newProllyRootNode }
310
+ return { clockCIDs, node: newProllyRootNode, head }
311
311
  },
312
312
  false
313
313
  )
@@ -101,10 +101,11 @@ export class Base {
101
101
  }
102
102
  cidMap.clear()
103
103
  const blocks = {
104
+ head: clock,
104
105
  lastCid: clock[0],
105
106
  get: cid => allBlocks.get(cid.toString())
106
107
  }
107
- console.log('compact', this.instanceId, this.name, blocks.lastCid.toString(), dataCids.length)
108
+ // console.log('compact', this.instanceId, this.name, blocks.lastCid.toString(), dataCids.length)
108
109
  await this.parkCar(blocks, dataCids)
109
110
  }
110
111
 
@@ -120,11 +121,11 @@ export class Base {
120
121
  newCar = await blocksToCarBlock(innerBlockstore.lastCid, innerBlockstore)
121
122
  }
122
123
  // console.log('new car', newCar.cid.toString())
123
- return await this.saveCar(newCar.cid.toString(), newCar.bytes, cids)
124
+ return await this.saveCar(newCar.cid.toString(), newCar.bytes, cids, innerBlockstore.head)
124
125
  }
125
126
 
126
- async saveCar (carCid, value, cids) {
127
- const newValetCidCar = await this.updateCarCidMap(carCid, cids)
127
+ async saveCar (carCid, value, cids, head = null) {
128
+ const newValetCidCar = await this.updateCarCidMap(carCid, cids, head)
128
129
  // console.log('writeCars', carCid.toString(), newValetCidCar.cid.toString())
129
130
  const carList = [
130
131
  {
@@ -146,7 +147,7 @@ export class Base {
146
147
  return newValetCidCar
147
148
  }
148
149
 
149
- applyHeaders (headers) {
150
+ async applyHeaders (headers) {
150
151
  // console.log('applyHeaders', headers.index)
151
152
  this.headers = headers
152
153
  // console.log('before applied', this.instanceId, this.name, this.keyMaterial, this.valetRootCarCid)
@@ -155,6 +156,9 @@ export class Base {
155
156
  // console.log('applyHeaders', this.instanceId, this.name, header.key, header.car)
156
157
  header.key && this.setKeyMaterial(header.key)
157
158
  this.setCarCidMapCarCid(header.car)
159
+ const { clock } = await this.readHeaderCar(header.car)
160
+ // console.log('stored clock', this.name, branch, clock, header)
161
+ header.clock = clock.map(c => c.toString())
158
162
  }
159
163
  }
160
164
  if (!this.valetRootCarCid) {
@@ -175,20 +179,32 @@ export class Base {
175
179
  const headers = {}
176
180
  for (const [branch] of Object.entries(this.config.branches)) {
177
181
  const got = await this.loadHeader(branch)
182
+ // const carCid = got.car
178
183
  // console.log('getHeaders', this.name, branch, got)
184
+ // if (got && got.car) {
185
+ // const { clock } = await this.readHeaderCar(got.car)
186
+ // console.log('stored clock', this.name, branch, clock)
187
+ // }
188
+
179
189
  headers[branch] = got
180
190
  }
181
- this.applyHeaders(headers)
191
+ await this.applyHeaders(headers)
182
192
  return headers
183
193
  }
184
194
 
185
195
  loadHeader (branch = 'main') {
186
- throw new Error('not implemented')
196
+ if (NOT_IMPL) throw new Error('not implemented')
197
+ return {}
198
+ }
199
+
200
+ async getStoredClock (carCid) {
201
+
187
202
  }
188
203
 
189
204
  async saveHeader (header) {
205
+ // this.clock = header.clock
190
206
  // for each branch, save the header
191
- // console.log('saveHeader', this.config.branches, header)
207
+ // console.log('saveHeader', header.clock)
192
208
  // for (const branch of this.branches) {
193
209
  // await this.saveBranchHeader(branch)
194
210
  // }
@@ -251,8 +267,13 @@ export class Base {
251
267
  async mapForIPLDHashmapCarCid (carCid) {
252
268
  // console.log('mapForIPLDHashmapCarCid', carCid)
253
269
  // todo why is this writeable?
254
- const carMapReader = await this.getWriteableCarReader(carCid)
255
- const indexNode = await load(carMapReader, carMapReader.root.cid, {
270
+ const { cars, reader: carMapReader } = await this.readHeaderCar(carCid)
271
+
272
+ // this.clock = clock
273
+
274
+ // console.log('mapForIPLDHashmapCarCid', cars)
275
+
276
+ const indexNode = await load(carMapReader, cars, {
256
277
  blockHasher: blockOpts.hasher,
257
278
  blockCodec: blockOpts.codec
258
279
  })
@@ -264,9 +285,21 @@ export class Base {
264
285
  return theCarMap
265
286
  }
266
287
 
288
+ async readHeaderCar (carCid) {
289
+ const carMapReader = await this.getWriteableCarReader(carCid)
290
+ // console.log('readHeaderCar', carCid, carMapReader)
291
+ // now when we load the root cid from the car, we get our new custom root node
292
+ const bytes = await carMapReader.get(carMapReader.root.cid)
293
+ const decoded = await Block.decode({ bytes, hasher: blockOpts.hasher, codec: blockOpts.codec })
294
+ // @ts-ignore
295
+ const { fp: { cars, clock } } = decoded.value
296
+ return { cars, clock, reader: carMapReader }
297
+ }
298
+
267
299
  async getWriteableCarReader (carCid) {
268
300
  // console.log('getWriteableCarReader', carCid)
269
301
  const carMapReader = await this.getCarReader(carCid)
302
+ // console.log('getWriteableCarReader', carCid, carMapReader)
270
303
  const theseWriteableBlocks = new VMemoryBlockstore()
271
304
  const combinedReader = {
272
305
  blocks: theseWriteableBlocks,
@@ -303,12 +336,16 @@ export class Base {
303
336
 
304
337
  async getCarReaderImpl (carCid) {
305
338
  carCid = carCid.toString()
339
+ // console.log('getCarReaderImpl', carCid)
306
340
  const carBytes = await this.readCar(carCid)
307
341
  // console.log('getCarReader', this.constructor.name, carCid, carBytes.length)
308
342
  const reader = await CarReader.fromBytes(carBytes)
343
+ // console.log('getCarReader', carCid, reader._header)
309
344
  if (this.keyMaterial) {
310
345
  const roots = await reader.getRoots()
346
+ // let count = 0
311
347
  const readerGetWithCodec = async cid => {
348
+ // console.log('readerGetWithCodec', count++, cid)
312
349
  const got = await reader.get(cid)
313
350
  let useCodec = codec
314
351
  if (cid.toString().indexOf('bafy') === 0) {
@@ -365,17 +402,17 @@ export class Base {
365
402
 
366
403
  writeCars (cars) {}
367
404
 
368
- async updateCarCidMap (carCid, cids) {
405
+ async updateCarCidMap (carCid, cids, head) {
369
406
  // this hydrates the map if it has not been hydrated
370
407
  const theCarMap = await this.getCidCarMap()
371
408
  for (const cid of cids) {
372
409
  theCarMap.set(cid, carCid)
373
410
  }
374
411
  // todo can we debounce this? -- maybe put it into a queue so we can batch it
375
- return await this.persistCarMap(theCarMap)
412
+ return await this.persistCarMap(theCarMap, head)
376
413
  }
377
414
 
378
- async persistCarMap (theCarMap) {
415
+ async persistCarMap (theCarMap, head) {
379
416
  const ipldLoader = await getEmptyLoader()
380
417
  const indexNode = await create(ipldLoader, {
381
418
  bitWidth: 4,
@@ -388,13 +425,21 @@ export class Base {
388
425
  await indexNode.set(key, value)
389
426
  }
390
427
 
428
+ // console.log('persistCarMap', indexNode.cid, head)
429
+ const value = { fp: { cars: indexNode.cid, clock: head } }
430
+ const header = await Block.encode({ value, hasher: blockOpts.hasher, codec: blockOpts.codec })
431
+ ipldLoader.blocks.put(header.cid, header.bytes)
432
+
391
433
  let newValetCidCar
392
434
  if (this.keyMaterial) {
393
435
  const cids = [...ipldLoader.blocks.blocks.keys()]
394
436
  // console.log('persistCarMap', cids)
395
- newValetCidCar = await blocksToEncryptedCarBlock(indexNode.cid, ipldLoader.blocks, this.keyMaterial, cids)
437
+ // store the clock head and a link to the indexNode.cid in a custom root?
438
+
439
+ newValetCidCar = await blocksToEncryptedCarBlock(header.cid, ipldLoader.blocks, this.keyMaterial, cids)
440
+ // then put this carcid into the header / w3clock
396
441
  } else {
397
- newValetCidCar = await blocksToCarBlock(indexNode.cid, ipldLoader.blocks)
442
+ newValetCidCar = await blocksToCarBlock(header.cid, ipldLoader.blocks)
398
443
  }
399
444
  return newValetCidCar
400
445
  }
@@ -529,6 +574,7 @@ export const blocksFromEncryptedCarBlock = async (cid, get, keyMaterial) => {
529
574
  cache
530
575
  // codec: dagcbor
531
576
  })) {
577
+ // console.log('decrypted', block.cid.toString())
532
578
  decryptedBlocks.push(block)
533
579
  cids.add(block.cid.toString())
534
580
  }
@@ -1,44 +0,0 @@
1
- import fetch from 'cross-fetch'
2
- import { Base } from './base.js'
3
-
4
- const defaultConfig = {
5
- upload: () => {},
6
- url: (cid) => `https://${cid}.ipfs.w3s.link/`
7
- }
8
-
9
- export class UCAN extends Base {
10
- constructor (name, config = {}) {
11
- super(name, Object.assign({}, defaultConfig, config))
12
- }
13
-
14
- async writeCars (cars) {
15
- if (this.config.readonly) return
16
- for (const { cid, bytes } of cars) {
17
- const upCid = await this.config.upload(bytes)
18
- console.log('writeCar UCAN', cid, upCid)
19
- // if (!response.ok) throw new Error(`An error occurred: ${response.statusText}`)
20
- }
21
- }
22
-
23
- async readCar (carCid) {
24
- const carURL = this.config.url(carCid)
25
- const response = await fetch(carURL)
26
- if (!response.ok) throw new Error(`An error occurred: ${response.statusText}`)
27
- const got = await response.arrayBuffer()
28
- return new Uint8Array(got)
29
- }
30
-
31
- async loadHeader (branch = 'main') {
32
- return headerMock.get(branch)
33
- }
34
-
35
- async writeHeader (branch, header) {
36
- if (this.config.readonly) return
37
- const pHeader = this.prepareHeader(header)
38
- // console.log('writeHeader rt', branch, pHeader)
39
-
40
- headerMock.set(branch, pHeader)
41
- }
42
- }
43
-
44
- const headerMock = new Map()