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.
- package/index.js +31 -17
- package/package.json +2 -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 //
|
|
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
|
-
//
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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 =
|
|
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.
|
|
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
|
-
//
|
|
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.
|
|
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.
|
|
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 () => {
|