braid-blob 0.0.10 → 0.0.12

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 (3) hide show
  1. package/index.js +38 -12
  2. package/package.json +1 -1
  3. package/server-demo.js +1 -1
package/index.js CHANGED
@@ -5,6 +5,7 @@ var {http_server: braidify, free_cors} = require('braid-http'),
5
5
 
6
6
  var braid_blob = {
7
7
  db_folder: './braid-blob-db',
8
+ meta_folder: './braid-blob-meta',
8
9
  cache: {}
9
10
  }
10
11
 
@@ -24,23 +25,34 @@ braid_blob.serve = async (req, res, options = {}) => {
24
25
 
25
26
  await within_fiber(options.key, async () => {
26
27
  const filename = `${braid_blob.db_folder}/${encode_filename(options.key)}`
28
+ const metaname = `${braid_blob.meta_folder}/${encode_filename(options.key)}`
27
29
 
30
+ // Read the meta file
31
+ var meta = {}
28
32
  try {
29
- var our_v = Math.round((await fs.promises.stat(filename)).mtimeMs)
33
+ meta = JSON.parse(await fs.promises.readFile(metaname, 'utf8'))
30
34
  } catch (e) {}
35
+ var our_v = meta.version
31
36
 
32
37
  if (req.method === 'GET') {
33
38
  // Handle GET request for binary files
34
39
 
40
+ if (our_v == null) {
41
+ res.statusCode = 404
42
+ return res.end('')
43
+ }
44
+
35
45
  // Set Version header;
36
46
  // but if this is a subscription,
37
47
  // then we set Current-Version instead
38
- res.setHeader((req.subscribe ? 'Current-' : '') + 'Version',
39
- our_v != null ? `"${our_v}"` : '')
48
+ res.setHeader((req.subscribe ? 'Current-' : '') + 'Version', `"${our_v}"`)
49
+
50
+ // Set Content-Type
51
+ if (meta.content_type)
52
+ res.setHeader('Content-Type', meta.content_type)
40
53
 
41
54
  if (!req.subscribe)
42
- return res.end(our_v != null ?
43
- await fs.promises.readFile(filename) : '')
55
+ return res.end(await fs.promises.readFile(filename))
44
56
 
45
57
  if (!res.hasHeader("editable"))
46
58
  res.setHeader("Editable", "true")
@@ -58,12 +70,11 @@ braid_blob.serve = async (req, res, options = {}) => {
58
70
 
59
71
 
60
72
  // Send an immediate update when:
61
- if (!req.parents || // 1) They have no version history
62
- // (need full sync)
63
- (our_v != null && ( // 2) We have a version AND...
64
- !req.parents.length || // a) Their version is the empty set
65
- our_v > 1*req.parents[0] // b) Our version is newer
66
- )))
73
+ if (!req.parents || // 1) They have no version history
74
+ // (need full sync)
75
+ !req.parents.length || // 2) Or their version is the empty set
76
+ our_v > 1*req.parents[0] // 3) Or our version is newer
77
+ )
67
78
  return res.sendUpdate({
68
79
  version: our_v != null ? ['' + our_v] : [],
69
80
  body: our_v != null ? await fs.promises.readFile(filename) : ''
@@ -74,6 +85,7 @@ braid_blob.serve = async (req, res, options = {}) => {
74
85
 
75
86
  // Ensure directory exists
76
87
  await fs.promises.mkdir(path.dirname(filename), { recursive: true })
88
+ await fs.promises.mkdir(path.dirname(metaname), { recursive: true })
77
89
 
78
90
  var their_v =
79
91
  !req.version ?
@@ -88,7 +100,12 @@ braid_blob.serve = async (req, res, options = {}) => {
88
100
 
89
101
  // Write the file
90
102
  await fs.promises.writeFile(filename, body)
91
- await fs.promises.utimes(filename, new Date(), new Date(their_v))
103
+
104
+ // Write the meta file
105
+ meta.version = their_v
106
+ if (req.headers['content-type'])
107
+ meta.content_type = req.headers['content-type']
108
+ await fs.promises.writeFile(metaname, JSON.stringify(meta))
92
109
 
93
110
  // Notify all subscriptions of the update
94
111
  // (except the peer which made the PUT request itself)
@@ -102,6 +119,15 @@ braid_blob.serve = async (req, res, options = {}) => {
102
119
  res.setHeader("Version", our_v != null ? `"${our_v}"` : '')
103
120
  }
104
121
  res.end('')
122
+ } else if (req.method === 'DELETE') {
123
+ try {
124
+ await fs.promises.unlink(filename)
125
+ } catch (e) {}
126
+ try {
127
+ await fs.promises.unlink(metaname)
128
+ } catch (e) {}
129
+ res.statusCode = 204 // No Content
130
+ res.end('')
105
131
  }
106
132
  })
107
133
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braid-blob",
3
- "version": "0.0.10",
3
+ "version": "0.0.12",
4
4
  "description": "Library for collaborative blobs over http using braid.",
5
5
  "author": "Braid Working Group",
6
6
  "repository": "braid-org/braid-blob",
package/server-demo.js CHANGED
@@ -15,7 +15,7 @@ var server = require("http").createServer(async (req, res) => {
15
15
 
16
16
  server.listen(port, () => {
17
17
  console.log(`server started on port ${port}`)
18
- console.log(`files stored in: ${braid_blob.storage_base}`)
18
+ console.log(`files stored in: ${braid_blob.db_folder}`)
19
19
  })
20
20
 
21
21
  // curl -X PUT --data-binary @image.png http://localhost:8888/image.png