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.
- package/index.js +34 -31
- 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)
|
|
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
|
-
|
|
488
|
-
|
|
489
|
-
let
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
545
|
-
|
|
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}/${
|
|
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}/${
|
|
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
|
|
634
|
+
await get_files_for_key(key)
|
|
632
635
|
).map((file) => {
|
|
633
636
|
return new Promise((resolve, reject) => {
|
|
634
637
|
fs.unlink(file, (err) => {
|