braid-blob 0.0.23 → 0.0.24
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/.claude/settings.local.json +9 -0
- package/index.js +31 -1
- package/package.json +1 -1
- package/test/tests.js +96 -0
package/index.js
CHANGED
|
@@ -209,6 +209,36 @@ function create_braid_blob() {
|
|
|
209
209
|
return result
|
|
210
210
|
}
|
|
211
211
|
|
|
212
|
+
braid_blob.delete = async (key, options = {}) => {
|
|
213
|
+
// Handle URL case - make a remote DELETE request
|
|
214
|
+
if (key instanceof URL) {
|
|
215
|
+
options.my_abort = new AbortController()
|
|
216
|
+
if (options.signal) {
|
|
217
|
+
options.signal.addEventListener('abort', () =>
|
|
218
|
+
options.my_abort.abort())
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
var params = {
|
|
222
|
+
method: 'DELETE',
|
|
223
|
+
signal: options.my_abort.signal
|
|
224
|
+
}
|
|
225
|
+
for (var x of ['headers', 'peer'])
|
|
226
|
+
if (options[x] != null) params[x] = options[x]
|
|
227
|
+
|
|
228
|
+
return await braid_fetch(key.href, params)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
await braid_blob.init()
|
|
232
|
+
|
|
233
|
+
// Delete the file from the database
|
|
234
|
+
await braid_blob.db.delete(key)
|
|
235
|
+
|
|
236
|
+
// TODO: notify subscribers of deletion once we have a protocol for that
|
|
237
|
+
// For now, just clean up the subscriptions
|
|
238
|
+
if (braid_blob.key_to_subs[key])
|
|
239
|
+
delete braid_blob.key_to_subs[key]
|
|
240
|
+
}
|
|
241
|
+
|
|
212
242
|
braid_blob.serve = async (req, res, options = {}) => {
|
|
213
243
|
await braid_blob.init()
|
|
214
244
|
|
|
@@ -292,7 +322,7 @@ function create_braid_blob() {
|
|
|
292
322
|
res.setHeader("Version", version_to_header(event != null ? [event] : []))
|
|
293
323
|
res.end('')
|
|
294
324
|
} else if (req.method === 'DELETE') {
|
|
295
|
-
await braid_blob.
|
|
325
|
+
await braid_blob.delete(options.key)
|
|
296
326
|
res.statusCode = 204 // No Content
|
|
297
327
|
res.end('')
|
|
298
328
|
}
|
package/package.json
CHANGED
package/test/tests.js
CHANGED
|
@@ -381,6 +381,102 @@ runTest(
|
|
|
381
381
|
'204'
|
|
382
382
|
)
|
|
383
383
|
|
|
384
|
+
runTest(
|
|
385
|
+
"test braid_blob.delete() directly",
|
|
386
|
+
async () => {
|
|
387
|
+
var r1 = await braid_fetch(`/eval`, {
|
|
388
|
+
method: 'POST',
|
|
389
|
+
body: `void (async () => {
|
|
390
|
+
var test_id = 'test-db-' + Math.random().toString(36).slice(2)
|
|
391
|
+
var db_folder = __dirname + '/' + test_id + '-db'
|
|
392
|
+
var meta_folder = __dirname + '/' + test_id + '-meta'
|
|
393
|
+
|
|
394
|
+
var bb = braid_blob.create_braid_blob()
|
|
395
|
+
bb.db_folder = db_folder
|
|
396
|
+
bb.meta_folder = meta_folder
|
|
397
|
+
|
|
398
|
+
try {
|
|
399
|
+
// Put a file
|
|
400
|
+
await bb.put('/test-file', Buffer.from('hello'))
|
|
401
|
+
|
|
402
|
+
// Verify it exists
|
|
403
|
+
var result = await bb.get('/test-file')
|
|
404
|
+
if (!result || !result.body) {
|
|
405
|
+
res.end('error: file not found after put')
|
|
406
|
+
return
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// Delete it
|
|
410
|
+
await bb.delete('/test-file')
|
|
411
|
+
|
|
412
|
+
// Verify it's gone
|
|
413
|
+
var result2 = await bb.get('/test-file')
|
|
414
|
+
if (result2) {
|
|
415
|
+
res.end('error: file still exists after delete')
|
|
416
|
+
return
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
res.end('true')
|
|
420
|
+
} catch (e) {
|
|
421
|
+
res.end('error: ' + e.message)
|
|
422
|
+
} finally {
|
|
423
|
+
await require('fs').promises.rm(db_folder, { recursive: true, force: true })
|
|
424
|
+
await require('fs').promises.rm(meta_folder, { recursive: true, force: true })
|
|
425
|
+
}
|
|
426
|
+
})()`
|
|
427
|
+
})
|
|
428
|
+
return await r1.text()
|
|
429
|
+
},
|
|
430
|
+
'true'
|
|
431
|
+
)
|
|
432
|
+
|
|
433
|
+
runTest(
|
|
434
|
+
"test braid_blob.delete() cleans up subscriptions",
|
|
435
|
+
async () => {
|
|
436
|
+
var r1 = await braid_fetch(`/eval`, {
|
|
437
|
+
method: 'POST',
|
|
438
|
+
body: `void (async () => {
|
|
439
|
+
var test_id = 'test-db-' + Math.random().toString(36).slice(2)
|
|
440
|
+
var db_folder = __dirname + '/' + test_id + '-db'
|
|
441
|
+
var meta_folder = __dirname + '/' + test_id + '-meta'
|
|
442
|
+
|
|
443
|
+
var bb = braid_blob.create_braid_blob()
|
|
444
|
+
bb.db_folder = db_folder
|
|
445
|
+
bb.meta_folder = meta_folder
|
|
446
|
+
|
|
447
|
+
try {
|
|
448
|
+
// Put a file
|
|
449
|
+
await bb.put('/test-file', Buffer.from('hello'))
|
|
450
|
+
|
|
451
|
+
// Subscribe to it
|
|
452
|
+
var got_update = false
|
|
453
|
+
await bb.get('/test-file', {
|
|
454
|
+
subscribe: (update) => { got_update = true }
|
|
455
|
+
})
|
|
456
|
+
|
|
457
|
+
// Verify subscription exists
|
|
458
|
+
var has_sub_before = !!bb.key_to_subs['/test-file']
|
|
459
|
+
|
|
460
|
+
// Delete it
|
|
461
|
+
await bb.delete('/test-file')
|
|
462
|
+
|
|
463
|
+
// Verify subscription is cleaned up
|
|
464
|
+
var has_sub_after = !!bb.key_to_subs['/test-file']
|
|
465
|
+
|
|
466
|
+
res.end('' + (has_sub_before && !has_sub_after))
|
|
467
|
+
} catch (e) {
|
|
468
|
+
res.end('error: ' + e.message)
|
|
469
|
+
} finally {
|
|
470
|
+
await require('fs').promises.rm(db_folder, { recursive: true, force: true })
|
|
471
|
+
await require('fs').promises.rm(meta_folder, { recursive: true, force: true })
|
|
472
|
+
}
|
|
473
|
+
})()`
|
|
474
|
+
})
|
|
475
|
+
return await r1.text()
|
|
476
|
+
},
|
|
477
|
+
'true'
|
|
478
|
+
)
|
|
479
|
+
|
|
384
480
|
runTest(
|
|
385
481
|
"test that subscribe returns current-version header",
|
|
386
482
|
async () => {
|