braid-blob 0.0.22 → 0.0.23
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 +3 -2
- package/package.json +2 -2
- package/test/tests.js +89 -0
package/index.js
CHANGED
|
@@ -23,9 +23,10 @@ function create_braid_blob() {
|
|
|
23
23
|
braid_blob.db = await url_file_db.create(
|
|
24
24
|
braid_blob.db_folder,
|
|
25
25
|
braid_blob.meta_folder,
|
|
26
|
-
async (key) => {
|
|
26
|
+
async (db, key) => {
|
|
27
27
|
// File changed externally, notify subscriptions
|
|
28
|
-
|
|
28
|
+
// Use db parameter instead of braid_blob.db to avoid race condition
|
|
29
|
+
var body = await db.read(key)
|
|
29
30
|
await braid_blob.put(key, body, { skip_write: true })
|
|
30
31
|
}
|
|
31
32
|
)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "braid-blob",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.23",
|
|
4
4
|
"description": "Library for collaborative blobs over http using braid.",
|
|
5
5
|
"author": "Braid Working Group",
|
|
6
6
|
"repository": "braid-org/braid-blob",
|
|
@@ -11,6 +11,6 @@
|
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"braid-http": "~1.3.82",
|
|
14
|
-
"url-file-db": "^0.0.
|
|
14
|
+
"url-file-db": "^0.0.21"
|
|
15
15
|
}
|
|
16
16
|
}
|
package/test/tests.js
CHANGED
|
@@ -1309,6 +1309,95 @@ runTest(
|
|
|
1309
1309
|
'true'
|
|
1310
1310
|
)
|
|
1311
1311
|
|
|
1312
|
+
runTest(
|
|
1313
|
+
"test that callback receives db parameter for use before assignment",
|
|
1314
|
+
async () => {
|
|
1315
|
+
var r1 = await braid_fetch(`/eval`, {
|
|
1316
|
+
method: 'POST',
|
|
1317
|
+
body: `void (async () => {
|
|
1318
|
+
var fs = require('fs').promises
|
|
1319
|
+
var test_id = 'test-callback-' + Math.random().toString(36).slice(2)
|
|
1320
|
+
var db_folder = __dirname + '/' + test_id + '-db'
|
|
1321
|
+
var meta_folder = __dirname + '/' + test_id + '-meta'
|
|
1322
|
+
|
|
1323
|
+
try {
|
|
1324
|
+
// Pre-create files that will trigger callback during init
|
|
1325
|
+
await fs.mkdir(db_folder, { recursive: true })
|
|
1326
|
+
await fs.mkdir(meta_folder, { recursive: true })
|
|
1327
|
+
|
|
1328
|
+
// Write a file that exists before init
|
|
1329
|
+
await fs.writeFile(db_folder + '/pre-existing', 'old content')
|
|
1330
|
+
|
|
1331
|
+
// Create metadata for it with old timestamp to trigger callback
|
|
1332
|
+
await fs.writeFile(meta_folder + '/!pre-existing', JSON.stringify({
|
|
1333
|
+
canonical_path: '/pre-existing',
|
|
1334
|
+
event: 'old-version',
|
|
1335
|
+
last_seen: Date.now() - 10000,
|
|
1336
|
+
mtime_ns: '1000000000000000'
|
|
1337
|
+
}))
|
|
1338
|
+
|
|
1339
|
+
// Wait for files to be written
|
|
1340
|
+
await new Promise(resolve => setTimeout(resolve, 100))
|
|
1341
|
+
|
|
1342
|
+
var callback_error = null
|
|
1343
|
+
var callback_called = false
|
|
1344
|
+
var db_was_null = false
|
|
1345
|
+
|
|
1346
|
+
// Monkey-patch url_file_db.create to intercept callback
|
|
1347
|
+
var url_file_db_module = require('url-file-db').url_file_db
|
|
1348
|
+
var original_create = url_file_db_module.create
|
|
1349
|
+
|
|
1350
|
+
url_file_db_module.create = async function(db_dir, meta_dir, callback) {
|
|
1351
|
+
var wrapped_callback = async function(db, key) {
|
|
1352
|
+
callback_called = true
|
|
1353
|
+
// Check if bb.db is null during callback
|
|
1354
|
+
if (!bb.db) {
|
|
1355
|
+
db_was_null = true
|
|
1356
|
+
}
|
|
1357
|
+
try {
|
|
1358
|
+
await callback(db, key)
|
|
1359
|
+
} catch (e) {
|
|
1360
|
+
callback_error = e.message
|
|
1361
|
+
}
|
|
1362
|
+
}
|
|
1363
|
+
return await original_create.call(this, db_dir, meta_dir, wrapped_callback)
|
|
1364
|
+
}
|
|
1365
|
+
|
|
1366
|
+
var bb = braid_blob.create_braid_blob()
|
|
1367
|
+
bb.db_folder = db_folder
|
|
1368
|
+
bb.meta_folder = meta_folder
|
|
1369
|
+
|
|
1370
|
+
// Init will trigger callback for pre-existing file
|
|
1371
|
+
// Callback tries to use braid_blob.db.read() but db not assigned yet
|
|
1372
|
+
await bb.init()
|
|
1373
|
+
|
|
1374
|
+
// Restore
|
|
1375
|
+
url_file_db_module.create = original_create
|
|
1376
|
+
|
|
1377
|
+
// Clean up
|
|
1378
|
+
await fs.rm(db_folder, { recursive: true, force: true })
|
|
1379
|
+
await fs.rm(meta_folder, { recursive: true, force: true })
|
|
1380
|
+
|
|
1381
|
+
if (!callback_called) {
|
|
1382
|
+
res.end('callback was not called')
|
|
1383
|
+
} else if (callback_error) {
|
|
1384
|
+
res.end('callback error: ' + callback_error)
|
|
1385
|
+
} else {
|
|
1386
|
+
// Success: callback worked even if bb.db was null (using db param)
|
|
1387
|
+
res.end('true')
|
|
1388
|
+
}
|
|
1389
|
+
} catch (e) {
|
|
1390
|
+
await fs.rm(db_folder, { recursive: true, force: true }).catch(() => {})
|
|
1391
|
+
await fs.rm(meta_folder, { recursive: true, force: true }).catch(() => {})
|
|
1392
|
+
res.end('error: ' + e.message)
|
|
1393
|
+
}
|
|
1394
|
+
})()`
|
|
1395
|
+
})
|
|
1396
|
+
return await r1.text()
|
|
1397
|
+
},
|
|
1398
|
+
'true'
|
|
1399
|
+
)
|
|
1400
|
+
|
|
1312
1401
|
}
|
|
1313
1402
|
|
|
1314
1403
|
// Export for Node.js (CommonJS)
|