braid-text 0.0.5 → 0.0.6
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 +26 -25
- 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
|
|
|
@@ -503,12 +509,9 @@ async function get_resource(key) {
|
|
|
503
509
|
resource.doc = new Doc("server")
|
|
504
510
|
|
|
505
511
|
let { change, delete_me } = braid_text.db_folder
|
|
506
|
-
? await file_sync(
|
|
507
|
-
braid_text.db_folder,
|
|
508
|
-
encode_filename(key),
|
|
512
|
+
? await file_sync(key,
|
|
509
513
|
(bytes) => resource.doc.mergeBytes(bytes),
|
|
510
|
-
() => resource.doc.toBytes()
|
|
511
|
-
)
|
|
514
|
+
() => resource.doc.toBytes())
|
|
512
515
|
: { change: () => { }, delete_me: () => { } }
|
|
513
516
|
|
|
514
517
|
resource.db_delta = change
|
|
@@ -524,32 +527,30 @@ async function get_resource(key) {
|
|
|
524
527
|
return (cache[key] = resource)
|
|
525
528
|
}
|
|
526
529
|
|
|
527
|
-
async function
|
|
530
|
+
async function get_files_for_key(key) {
|
|
531
|
+
try {
|
|
532
|
+
let re = new RegExp("^" + encode_filename(key).replace(/[^a-zA-Z0-9]/g, "\\$&") + "\\.\\d+$")
|
|
533
|
+
return (await fs.promises.readdir(braid_text.db_folder))
|
|
534
|
+
.filter((a) => re.test(a))
|
|
535
|
+
.map((a) => `${braid_text.db_folder}/${a}`)
|
|
536
|
+
} catch (e) { return [] }
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
async function file_sync(key, process_delta, get_init) {
|
|
528
540
|
let currentNumber = 0
|
|
529
541
|
let currentSize = 0
|
|
530
542
|
let threshold = 0
|
|
531
543
|
|
|
532
544
|
// Ensure the existence of db_folder
|
|
533
545
|
try {
|
|
534
|
-
await fs.promises.access(db_folder);
|
|
546
|
+
await fs.promises.access(braid_text.db_folder);
|
|
535
547
|
} catch (err) {
|
|
536
|
-
|
|
537
|
-
await fs.promises.mkdir(db_folder, { recursive: true });
|
|
538
|
-
} else {
|
|
539
|
-
throw err;
|
|
540
|
-
}
|
|
548
|
+
await fs.promises.mkdir(braid_text.db_folder, { recursive: true });
|
|
541
549
|
}
|
|
542
550
|
|
|
543
551
|
// 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()
|
|
552
|
+
const files = (await get_files_for_key(key))
|
|
553
|
+
.sort((a, b) => parseInt(a.match(/\d+$/)[0]) - parseInt(b.match(/\d+$/)[0]))
|
|
553
554
|
|
|
554
555
|
// Try to process files starting from the highest number.
|
|
555
556
|
let done = false
|
|
@@ -590,7 +591,7 @@ async function file_sync(db_folder, filename_base, process_delta, get_init) {
|
|
|
590
591
|
return {
|
|
591
592
|
change: async (bytes) => {
|
|
592
593
|
currentSize += bytes.length + 4 // we account for the extra 4 bytes for uint32
|
|
593
|
-
const filename = `${db_folder}/${
|
|
594
|
+
const filename = `${braid_text.db_folder}/${encode_filename(key)}.${currentNumber}`
|
|
594
595
|
if (currentSize < threshold) {
|
|
595
596
|
console.log(`appending to db..`)
|
|
596
597
|
|
|
@@ -609,7 +610,7 @@ async function file_sync(db_folder, filename_base, process_delta, get_init) {
|
|
|
609
610
|
const buffer = Buffer.allocUnsafe(4)
|
|
610
611
|
buffer.writeUInt32LE(init.length, 0)
|
|
611
612
|
|
|
612
|
-
const newFilename = `${db_folder}/${
|
|
613
|
+
const newFilename = `${braid_text.db_folder}/${encode_filename(key)}.${currentNumber}`
|
|
613
614
|
await fs.promises.writeFile(newFilename, buffer)
|
|
614
615
|
await fs.promises.appendFile(newFilename, init)
|
|
615
616
|
|
|
@@ -628,7 +629,7 @@ async function file_sync(db_folder, filename_base, process_delta, get_init) {
|
|
|
628
629
|
delete_me: async () => {
|
|
629
630
|
await Promise.all(
|
|
630
631
|
(
|
|
631
|
-
await
|
|
632
|
+
await get_files_for_key(key)
|
|
632
633
|
).map((file) => {
|
|
633
634
|
return new Promise((resolve, reject) => {
|
|
634
635
|
fs.unlink(file, (err) => {
|