braid-text 0.0.5 → 0.0.7

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 +34 -31
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -167,7 +167,13 @@ braid_text.serve = async (req, res, options = {}) => {
167
167
  }
168
168
 
169
169
  braid_text.get = async (key, options) => {
170
- if (!options) return get_resource.cache?.[key]?.doc.get()
170
+ if (!options) {
171
+ let x = get_resource.cache?.[key]?.doc.get()
172
+ if (x !== undefined) return x
173
+ // if it doesn't exist on disk, don't create it in this case
174
+ if (!(await get_files_for_key(key)).length) return
175
+ return (await get_resource(key)).doc.get()
176
+ }
171
177
 
172
178
  let resource = (typeof key == 'string') ? await get_resource(key) : key
173
179
 
@@ -484,12 +490,14 @@ braid_text.put = async (key, options) => {
484
490
  }
485
491
 
486
492
  braid_text.list = async () => {
487
- var pages = new Set()
488
- for (let x of await require('fs').promises.readdir(braid_text.db_folder)) {
489
- let m = x.match(/^(.*)\.\d+$/)
490
- if (m) pages.add(decode_filename(m[1]))
491
- }
492
- return [...pages.keys()]
493
+ try {
494
+ var pages = new Set()
495
+ for (let x of await require('fs').promises.readdir(braid_text.db_folder)) {
496
+ let m = x.match(/^(.*)\.\d+$/)
497
+ if (m) pages.add(decode_filename(m[1]))
498
+ }
499
+ return [...pages.keys()]
500
+ } catch (e) { return [] }
493
501
  }
494
502
 
495
503
  async function get_resource(key) {
@@ -503,12 +511,9 @@ async function get_resource(key) {
503
511
  resource.doc = new Doc("server")
504
512
 
505
513
  let { change, delete_me } = braid_text.db_folder
506
- ? await file_sync(
507
- braid_text.db_folder,
508
- encode_filename(key),
514
+ ? await file_sync(key,
509
515
  (bytes) => resource.doc.mergeBytes(bytes),
510
- () => resource.doc.toBytes()
511
- )
516
+ () => resource.doc.toBytes())
512
517
  : { change: () => { }, delete_me: () => { } }
513
518
 
514
519
  resource.db_delta = change
@@ -524,32 +529,30 @@ async function get_resource(key) {
524
529
  return (cache[key] = resource)
525
530
  }
526
531
 
527
- async function file_sync(db_folder, filename_base, process_delta, get_init) {
532
+ async function get_files_for_key(key) {
533
+ try {
534
+ let re = new RegExp("^" + encode_filename(key).replace(/[^a-zA-Z0-9]/g, "\\$&") + "\\.\\d+$")
535
+ return (await fs.promises.readdir(braid_text.db_folder))
536
+ .filter((a) => re.test(a))
537
+ .map((a) => `${braid_text.db_folder}/${a}`)
538
+ } catch (e) { return [] }
539
+ }
540
+
541
+ async function file_sync(key, process_delta, get_init) {
528
542
  let currentNumber = 0
529
543
  let currentSize = 0
530
544
  let threshold = 0
531
545
 
532
546
  // Ensure the existence of db_folder
533
547
  try {
534
- await fs.promises.access(db_folder);
548
+ await fs.promises.access(braid_text.db_folder);
535
549
  } catch (err) {
536
- if (err.code === 'ENOENT') {
537
- await fs.promises.mkdir(db_folder, { recursive: true });
538
- } else {
539
- throw err;
540
- }
550
+ await fs.promises.mkdir(braid_text.db_folder, { recursive: true });
541
551
  }
542
552
 
543
553
  // Read existing files and sort by numbers.
544
- async function get_sorted_files() {
545
- let re = new RegExp("^" + filename_base.replace(/[^a-zA-Z0-9]/g, "\\$&") + "\\.\\d+$")
546
- return (await fs.promises.readdir(db_folder))
547
- .filter((a) => re.test(a))
548
- .sort((a, b) => parseInt(a.match(/\d+$/)[0]) - parseInt(b.match(/\d+$/)[0]))
549
- .map((a) => `${db_folder}/${a}`)
550
- }
551
-
552
- const files = await get_sorted_files()
554
+ const files = (await get_files_for_key(key))
555
+ .sort((a, b) => parseInt(a.match(/\d+$/)[0]) - parseInt(b.match(/\d+$/)[0]))
553
556
 
554
557
  // Try to process files starting from the highest number.
555
558
  let done = false
@@ -590,7 +593,7 @@ async function file_sync(db_folder, filename_base, process_delta, get_init) {
590
593
  return {
591
594
  change: async (bytes) => {
592
595
  currentSize += bytes.length + 4 // we account for the extra 4 bytes for uint32
593
- const filename = `${db_folder}/${filename_base}.${currentNumber}`
596
+ const filename = `${braid_text.db_folder}/${encode_filename(key)}.${currentNumber}`
594
597
  if (currentSize < threshold) {
595
598
  console.log(`appending to db..`)
596
599
 
@@ -609,7 +612,7 @@ async function file_sync(db_folder, filename_base, process_delta, get_init) {
609
612
  const buffer = Buffer.allocUnsafe(4)
610
613
  buffer.writeUInt32LE(init.length, 0)
611
614
 
612
- const newFilename = `${db_folder}/${filename_base}.${currentNumber}`
615
+ const newFilename = `${braid_text.db_folder}/${encode_filename(key)}.${currentNumber}`
613
616
  await fs.promises.writeFile(newFilename, buffer)
614
617
  await fs.promises.appendFile(newFilename, init)
615
618
 
@@ -628,7 +631,7 @@ async function file_sync(db_folder, filename_base, process_delta, get_init) {
628
631
  delete_me: async () => {
629
632
  await Promise.all(
630
633
  (
631
- await get_sorted_files()
634
+ await get_files_for_key(key)
632
635
  ).map((file) => {
633
636
  return new Promise((resolve, reject) => {
634
637
  fs.unlink(file, (err) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braid-text",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "description": "Library for collaborative text over http using braid.",
5
5
  "author": "Braid Working Group",
6
6
  "repository": "braid-org/braidjs",