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 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
- var body = await braid_blob.db.read(key)
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.22",
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.19"
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)