braid-text 0.2.99 → 0.2.100

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 (2) hide show
  1. package/index.js +16 -4
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -1296,6 +1296,12 @@ function create_braid_text() {
1296
1296
  if (!db_folder_init.p) db_folder_init.p = new Promise(async done => {
1297
1297
  await fs.promises.mkdir(braid_text.db_folder, { recursive: true });
1298
1298
  await fs.promises.mkdir(`${braid_text.db_folder}/.meta`, { recursive: true })
1299
+ await fs.promises.mkdir(`${braid_text.db_folder}/.temp`, { recursive: true })
1300
+
1301
+ // Clean out .temp directory on startup
1302
+ var temp_files = await fs.promises.readdir(`${braid_text.db_folder}/.temp`)
1303
+ for (var f of temp_files)
1304
+ await fs.promises.unlink(`${braid_text.db_folder}/.temp/${f}`)
1299
1305
 
1300
1306
  // Populate key_to_filename mapping from existing files
1301
1307
  var files = (await fs.promises.readdir(braid_text.db_folder))
@@ -1401,8 +1407,8 @@ function create_braid_text() {
1401
1407
  buffer.writeUInt32LE(init.length, 0)
1402
1408
 
1403
1409
  const newFilename = `${braid_text.db_folder}/${encoded}.${currentNumber}`
1404
- await fs.promises.writeFile(newFilename, buffer)
1405
- await fs.promises.appendFile(newFilename, init)
1410
+ await atomic_write(newFilename, Buffer.concat([buffer, init]),
1411
+ `${braid_text.db_folder}/.temp`)
1406
1412
 
1407
1413
  if (braid_text.verbose) console.log("wrote to : " + newFilename)
1408
1414
 
@@ -1423,8 +1429,8 @@ function create_braid_text() {
1423
1429
 
1424
1430
  while (meta_dirty) {
1425
1431
  meta_dirty = false
1426
- await fs.promises.writeFile(meta_filename,
1427
- JSON.stringify(get_meta()))
1432
+ await atomic_write(meta_filename, JSON.stringify(get_meta()),
1433
+ `${braid_text.db_folder}/.temp`)
1428
1434
  await new Promise(done => setTimeout(done,
1429
1435
  braid_text.meta_file_save_period_ms))
1430
1436
  }
@@ -2727,6 +2733,12 @@ function create_braid_text() {
2727
2733
  return `sha-256=:${require('crypto').createHash('sha256').update(s).digest('base64')}:`
2728
2734
  }
2729
2735
 
2736
+ async function atomic_write(final_destination, data, temp_folder) {
2737
+ var temp = `${temp_folder}/${Math.random().toString(36).slice(2)}`
2738
+ await fs.promises.writeFile(temp, data)
2739
+ await fs.promises.rename(temp, final_destination)
2740
+ }
2741
+
2730
2742
  function within_fiber(id, func) {
2731
2743
  if (!within_fiber.chains) within_fiber.chains = {}
2732
2744
  var prev = within_fiber.chains[id] || Promise.resolve()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braid-text",
3
- "version": "0.2.99",
3
+ "version": "0.2.100",
4
4
  "description": "Library for collaborative text over http using braid.",
5
5
  "author": "Braid Working Group",
6
6
  "repository": "braid-org/braid-text",