braid-blob 0.0.33 → 0.0.35

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.
Files changed (3) hide show
  1. package/index.js +31 -17
  2. package/package.json +2 -3
  3. package/test/tests.js +3 -92
package/index.js CHANGED
@@ -1,5 +1,4 @@
1
1
  var {http_server: braidify, fetch: braid_fetch} = require('braid-http'),
2
- {url_file_db} = require('url-file-db'),
3
2
  fs = require('fs'),
4
3
  path = require('path')
5
4
 
@@ -11,7 +10,7 @@ function create_braid_blob() {
11
10
  meta_cache: {},
12
11
  key_to_subs: {},
13
12
  peer: null, // will be auto-generated if not set by the user
14
- db: null // url-file-db instance
13
+ db: null // object with read/write/delete methods
15
14
  }
16
15
 
17
16
  braid_blob.init = async () => {
@@ -24,21 +23,36 @@ function create_braid_blob() {
24
23
  // Ensure our meta folder exists
25
24
  await fs.promises.mkdir(braid_blob.meta_folder, { recursive: true })
26
25
 
27
- // Create a fake meta folder for url-file-db (we manage our own meta)
28
- var fake_meta_folder = braid_blob.meta_folder + '-fake'
29
- await fs.promises.mkdir(fake_meta_folder, { recursive: true })
30
-
31
- // Create url-file-db instance (with fake meta folder - we manage our own)
32
- braid_blob.db = await url_file_db.create(
33
- braid_blob.db_folder,
34
- fake_meta_folder,
35
- async (db, key) => {
36
- // File changed externally, notify subscriptions
37
- // Use db parameter instead of braid_blob.db to avoid race condition
38
- var body = await db.read(key)
39
- await braid_blob.put(key, body, { skip_write: true })
26
+ // Set up db - either use provided object or create file-based storage
27
+ if (typeof braid_blob.db_folder === 'string') {
28
+ await fs.promises.mkdir(braid_blob.db_folder, { recursive: true })
29
+ braid_blob.db = {
30
+ read: async (key) => {
31
+ var file_path = path.join(braid_blob.db_folder, encode_filename(key))
32
+ try {
33
+ return await fs.promises.readFile(file_path)
34
+ } catch (e) {
35
+ if (e.code === 'ENOENT') return null
36
+ throw e
37
+ }
38
+ },
39
+ write: async (key, data) => {
40
+ var file_path = path.join(braid_blob.db_folder, encode_filename(key))
41
+ await fs.promises.writeFile(file_path, data)
42
+ },
43
+ delete: async (key) => {
44
+ var file_path = path.join(braid_blob.db_folder, encode_filename(key))
45
+ try {
46
+ await fs.promises.unlink(file_path)
47
+ } catch (e) {
48
+ if (e.code !== 'ENOENT') throw e
49
+ }
50
+ }
40
51
  }
41
- )
52
+ } else {
53
+ // db_folder is already an object with read/write/delete
54
+ braid_blob.db = braid_blob.db_folder
55
+ }
42
56
 
43
57
  // establish a peer id if not already set
44
58
  if (!braid_blob.peer)
@@ -270,7 +284,7 @@ function create_braid_blob() {
270
284
 
271
285
  if (!options.key) {
272
286
  var url = new URL(req.url, 'http://localhost')
273
- options.key = url_file_db.get_canonical_path(url.pathname)
287
+ options.key = url.pathname
274
288
  }
275
289
 
276
290
  braidify(req, res)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braid-blob",
3
- "version": "0.0.33",
3
+ "version": "0.0.35",
4
4
  "description": "Library for collaborative blobs over http using braid.",
5
5
  "author": "Braid Working Group",
6
6
  "repository": "braid-org/braid-blob",
@@ -10,7 +10,6 @@
10
10
  "test:browser": "node test/test.js --browser"
11
11
  },
12
12
  "dependencies": {
13
- "braid-http": "~1.3.83",
14
- "url-file-db": "^0.0.25"
13
+ "braid-http": "~1.3.83"
15
14
  }
16
15
  }
package/test/tests.js CHANGED
@@ -1365,7 +1365,7 @@ runTest(
1365
1365
  bb2.db_folder = db_folder
1366
1366
  bb2.meta_folder = meta_folder
1367
1367
 
1368
- // This should NOT trigger a file change callback
1368
+ // Get the file from the new instance
1369
1369
  var result2 = await bb2.get(test_key)
1370
1370
 
1371
1371
  // Version should still be version-2, not regenerated
@@ -1419,7 +1419,7 @@ runTest(
1419
1419
  var result1 = await bb1.get(test_key)
1420
1420
 
1421
1421
  // Check what metadata was saved
1422
- var meta1 = bb1.db.get_meta(test_key)
1422
+ var meta1 = bb1.meta_cache[test_key]
1423
1423
  var debug_info = 'meta1: ' + JSON.stringify(meta1) + '; '
1424
1424
 
1425
1425
  // Wait a bit to ensure file system has settled
@@ -1435,7 +1435,7 @@ runTest(
1435
1435
  var result2 = await bb2.get(test_key)
1436
1436
 
1437
1437
  // Check what metadata bb2 sees
1438
- var meta2 = bb2.db.get_meta(test_key)
1438
+ var meta2 = bb2.meta_cache[test_key]
1439
1439
  debug_info += 'meta2: ' + JSON.stringify(meta2) + '; '
1440
1440
 
1441
1441
  // The version should be the same - no new event ID generated
@@ -1461,95 +1461,6 @@ runTest(
1461
1461
  'true'
1462
1462
  )
1463
1463
 
1464
- runTest(
1465
- "test that callback receives db parameter for use before assignment",
1466
- async () => {
1467
- var r1 = await braid_fetch(`/eval`, {
1468
- method: 'POST',
1469
- body: `void (async () => {
1470
- var fs = require('fs').promises
1471
- var test_id = 'test-callback-' + Math.random().toString(36).slice(2)
1472
- var db_folder = __dirname + '/' + test_id + '-db'
1473
- var meta_folder = __dirname + '/' + test_id + '-meta'
1474
-
1475
- try {
1476
- // Pre-create files that will trigger callback during init
1477
- await fs.mkdir(db_folder, { recursive: true })
1478
- await fs.mkdir(meta_folder, { recursive: true })
1479
-
1480
- // Write a file that exists before init
1481
- await fs.writeFile(db_folder + '/pre-existing', 'old content')
1482
-
1483
- // Create metadata for it with old timestamp to trigger callback
1484
- await fs.writeFile(meta_folder + '/!pre-existing', JSON.stringify({
1485
- canonical_path: '/pre-existing',
1486
- event: 'old-version',
1487
- last_seen: Date.now() - 10000,
1488
- mtime_ns: '1000000000000000'
1489
- }))
1490
-
1491
- // Wait for files to be written
1492
- await new Promise(resolve => setTimeout(resolve, 100))
1493
-
1494
- var callback_error = null
1495
- var callback_called = false
1496
- var db_was_null = false
1497
-
1498
- // Monkey-patch url_file_db.create to intercept callback
1499
- var url_file_db_module = require('url-file-db').url_file_db
1500
- var original_create = url_file_db_module.create
1501
-
1502
- url_file_db_module.create = async function(db_dir, meta_dir, callback) {
1503
- var wrapped_callback = async function(db, key) {
1504
- callback_called = true
1505
- // Check if bb.db is null during callback
1506
- if (!bb.db) {
1507
- db_was_null = true
1508
- }
1509
- try {
1510
- await callback(db, key)
1511
- } catch (e) {
1512
- callback_error = e.message
1513
- }
1514
- }
1515
- return await original_create.call(this, db_dir, meta_dir, wrapped_callback)
1516
- }
1517
-
1518
- var bb = braid_blob.create_braid_blob()
1519
- bb.db_folder = db_folder
1520
- bb.meta_folder = meta_folder
1521
-
1522
- // Init will trigger callback for pre-existing file
1523
- // Callback tries to use braid_blob.db.read() but db not assigned yet
1524
- await bb.init()
1525
-
1526
- // Restore
1527
- url_file_db_module.create = original_create
1528
-
1529
- // Clean up
1530
- await fs.rm(db_folder, { recursive: true, force: true })
1531
- await fs.rm(meta_folder, { recursive: true, force: true })
1532
-
1533
- if (!callback_called) {
1534
- res.end('callback was not called')
1535
- } else if (callback_error) {
1536
- res.end('callback error: ' + callback_error)
1537
- } else {
1538
- // Success: callback worked even if bb.db was null (using db param)
1539
- res.end('true')
1540
- }
1541
- } catch (e) {
1542
- await fs.rm(db_folder, { recursive: true, force: true }).catch(() => {})
1543
- await fs.rm(meta_folder, { recursive: true, force: true }).catch(() => {})
1544
- res.end('error: ' + e.message)
1545
- }
1546
- })()`
1547
- })
1548
- return await r1.text()
1549
- },
1550
- 'true'
1551
- )
1552
-
1553
1464
  runTest(
1554
1465
  "test get with URL returns null on 404",
1555
1466
  async () => {