added blob 'checkout' on open in new window
This commit is contained in:
		
							parent
							
								
									616af83706
								
							
						
					
					
						commit
						93184f5b69
					
				
							
								
								
									
										42
									
								
								app/index.js
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								app/index.js
									
									
									
									
									
								
							@ -1,26 +1,26 @@
 | 
				
			|||||||
var app = require('app')
 | 
					var app = require('app')
 | 
				
			||||||
var path = require('path')
 | 
					 | 
				
			||||||
var Tray = require('tray')
 | 
					 | 
				
			||||||
var Menu = require('menu')
 | 
					var Menu = require('menu')
 | 
				
			||||||
var shell = require('shell')
 | 
					var shell = require('shell')
 | 
				
			||||||
var BrowserWindow = require('browser-window')
 | 
					var BrowserWindow = require('browser-window')
 | 
				
			||||||
 | 
					var path = require('path')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var config = require('ssb-config') 
 | 
					var config = require('ssb-config') 
 | 
				
			||||||
var toPath = require('multiblob/util').toPath
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Report crashes to our server.
 | 
					// Report crashes to our server.
 | 
				
			||||||
//require('crash-reporter').start();
 | 
					//require('crash-reporter').start();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var tray
 | 
					 | 
				
			||||||
var mainWindow
 | 
					var mainWindow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
app.on('ready', function ready () {
 | 
					app.on('ready', function ready () {
 | 
				
			||||||
 | 
					  // setup blobs
 | 
				
			||||||
  var blobs_dir = path.join(config.path, 'blobs')
 | 
					  var blobs_dir = path.join(config.path, 'blobs')
 | 
				
			||||||
 | 
					  var downloads_dir = app.getPath('userDesktop')
 | 
				
			||||||
 | 
					  var blobs = require('./lib/blobs')(blobs_dir, downloads_dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // start sbot
 | 
					  // start sbot
 | 
				
			||||||
  require('scuttlebot').init(config, function (err, sbot) {
 | 
					  require('scuttlebot').init(config, function (err, sbot) {
 | 
				
			||||||
    // register protocols
 | 
					    // register protocols
 | 
				
			||||||
    require('protocol').registerProtocol('blob', require('./lib/blob-protocol')(config))
 | 
					    require('protocol').registerProtocol('blob', blobs.protocol)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // open the web app
 | 
					    // open the web app
 | 
				
			||||||
    mainWindow = new BrowserWindow({width: 1000, height: 720})
 | 
					    mainWindow = new BrowserWindow({width: 1000, height: 720})
 | 
				
			||||||
@ -32,8 +32,17 @@ app.on('ready', function ready () {
 | 
				
			|||||||
      e.preventDefault() // hell naw
 | 
					      e.preventDefault() // hell naw
 | 
				
			||||||
      if (url.indexOf('blob:') === 0) {
 | 
					      if (url.indexOf('blob:') === 0) {
 | 
				
			||||||
        // open the file
 | 
					        // open the file
 | 
				
			||||||
        var id = url.split(':')[1]
 | 
					        blobs.checkout(url, function (err, path) {
 | 
				
			||||||
        shell.openItem(toPath(blobs_dir, id))
 | 
					          if (err) {
 | 
				
			||||||
 | 
					            if (err.badUrl)
 | 
				
			||||||
 | 
					              alert('Error: Not a valid file reference')
 | 
				
			||||||
 | 
					            else if (err.notFound)
 | 
				
			||||||
 | 
					              alert('Error: This file has not yet been synced. Please try again soon.') // :TODO: show 'search' window
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					              console.log(err) // :TODO: something nicer
 | 
				
			||||||
 | 
					          } else
 | 
				
			||||||
 | 
					            shell.openItem(path)
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        // open in the browser
 | 
					        // open in the browser
 | 
				
			||||||
        shell.openExternal(url)
 | 
					        shell.openExternal(url)
 | 
				
			||||||
@ -49,24 +58,5 @@ app.on('ready', function ready () {
 | 
				
			|||||||
    //   ]
 | 
					    //   ]
 | 
				
			||||||
    // }]))
 | 
					    // }]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // setup tray icon
 | 
					 | 
				
			||||||
    tray = new Tray(__dirname+'/icon.png')
 | 
					 | 
				
			||||||
    tray.setContextMenu(Menu.buildFromTemplate([
 | 
					 | 
				
			||||||
      // { label: 'Open Web App', click: onopen },
 | 
					 | 
				
			||||||
      { label: 'Quit', click: onquit }
 | 
					 | 
				
			||||||
    ]))
 | 
					 | 
				
			||||||
    tray.setToolTip('Secure Scuttlebutt: Running on port 8008')
 | 
					 | 
				
			||||||
    // tray.on('double-clicked', onopen)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // menu handlers
 | 
					 | 
				
			||||||
    function onopen () {
 | 
					 | 
				
			||||||
      shell.openExternal('http://localhost:8008')
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    function onquit () {
 | 
					 | 
				
			||||||
      tray = null
 | 
					 | 
				
			||||||
      sbot.close()
 | 
					 | 
				
			||||||
      process.exit()
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
@ -1,13 +0,0 @@
 | 
				
			|||||||
var protocol = require('protocol')
 | 
					 | 
				
			||||||
var path = require('path')
 | 
					 | 
				
			||||||
var toPath = require('multiblob/util').toPath
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
module.exports = function (config) {
 | 
					 | 
				
			||||||
  var dir = path.join(config.path, 'blobs')
 | 
					 | 
				
			||||||
  return function (request) {
 | 
					 | 
				
			||||||
    var id = request.url.split(':')[1]
 | 
					 | 
				
			||||||
    if (request.method == 'GET' && id) {
 | 
					 | 
				
			||||||
      return new protocol.RequestFileJob(toPath(dir, id))
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										93
									
								
								app/lib/blobs.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								app/lib/blobs.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,93 @@
 | 
				
			|||||||
 | 
					var path = require('path')
 | 
				
			||||||
 | 
					var multicb = require('multicb')
 | 
				
			||||||
 | 
					var toPath = require('multiblob/util').toPath
 | 
				
			||||||
 | 
					var querystring = require('querystring')
 | 
				
			||||||
 | 
					var fs = require('fs')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// blob url parser
 | 
				
			||||||
 | 
					var re = /^blob:([a-z0-9\+\/=]+\.blake2s)\??(.*)$/i
 | 
				
			||||||
 | 
					var url_parse =
 | 
				
			||||||
 | 
					module.exports.url_parse = function (str) {
 | 
				
			||||||
 | 
					  var parts = re.exec(str)
 | 
				
			||||||
 | 
					  if (parts)
 | 
				
			||||||
 | 
					    return { hash: parts[1], qs: querystring.parse(parts[2]) }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// blob url builder
 | 
				
			||||||
 | 
					var url_stringify =
 | 
				
			||||||
 | 
					module.exports.url_stringify = function (hash, qs) {
 | 
				
			||||||
 | 
					  var url = 'blob:'+hash
 | 
				
			||||||
 | 
					  if (qs && typeof qs == 'object')
 | 
				
			||||||
 | 
					    url += '?' + querystring.stringify(qs)
 | 
				
			||||||
 | 
					  return url
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = function (blobs_dir, checkout_dir) {
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    // behavior for the blob: protocol
 | 
				
			||||||
 | 
					    protocol: function (request) {
 | 
				
			||||||
 | 
					      var protocol = require('protocol') // have to require here, doing so before app:ready causes errors
 | 
				
			||||||
 | 
					      // simple fetch
 | 
				
			||||||
 | 
					      var parsed = url_parse(request.url)
 | 
				
			||||||
 | 
					      if (request.method == 'GET' && parsed) {
 | 
				
			||||||
 | 
					        return new protocol.RequestFileJob(toPath(blobs_dir, parsed.hash))
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // copy file from blobs into given dir with nice name
 | 
				
			||||||
 | 
					    checkout: function (url, cb) {
 | 
				
			||||||
 | 
					      var parsed = url_parse(url)
 | 
				
			||||||
 | 
					      if (!parsed)
 | 
				
			||||||
 | 
					        return cb({ badUrl: true })
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      var filename = parsed.qs.name || parsed.qs.filename || parsed.hash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // check if we have the blob, at the same time find an available filename
 | 
				
			||||||
 | 
					      var done = multicb({ pluck: 1 })
 | 
				
			||||||
 | 
					      fs.stat(toPath(blobs_dir, parsed.hash), done())
 | 
				
			||||||
 | 
					      findFreeCheckoutPath(filename, done())
 | 
				
			||||||
 | 
					      done(function (err, res) {
 | 
				
			||||||
 | 
					        if (!res[0])
 | 
				
			||||||
 | 
					          return cb({ notFound: true })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // copy the file
 | 
				
			||||||
 | 
					        var src = toPath(blobs_dir, parsed.hash)
 | 
				
			||||||
 | 
					        var dst = res[1]
 | 
				
			||||||
 | 
					        var read = fs.createReadStream(src)
 | 
				
			||||||
 | 
					        var write = fs.createWriteStream(dst)
 | 
				
			||||||
 | 
					        read.on('error', done)
 | 
				
			||||||
 | 
					        write.on('error', done)
 | 
				
			||||||
 | 
					        write.on('close', done)
 | 
				
			||||||
 | 
					        read.pipe(write)
 | 
				
			||||||
 | 
					        function done (err) {
 | 
				
			||||||
 | 
					          cb && cb(err, dst)
 | 
				
			||||||
 | 
					          cb = null
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // helper to create a filename in checkout_dir that isnt already in use
 | 
				
			||||||
 | 
					  function findFreeCheckoutPath (filename, cb) {
 | 
				
			||||||
 | 
					    var n = 1
 | 
				
			||||||
 | 
					    var parsed = path.parse(filename)
 | 
				
			||||||
 | 
					    next()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function gen () {
 | 
				
			||||||
 | 
					      var name = parsed.name
 | 
				
			||||||
 | 
					      if (n !== 1) name += ' ('+n+')'
 | 
				
			||||||
 | 
					      name += parsed.ext
 | 
				
			||||||
 | 
					      n++
 | 
				
			||||||
 | 
					      return path.join(checkout_dir, name)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function next () {
 | 
				
			||||||
 | 
					      var filepath = gen()
 | 
				
			||||||
 | 
					      fs.stat(filepath, function (err, stat) {
 | 
				
			||||||
 | 
					        if (!stat)
 | 
				
			||||||
 | 
					          return cb(null, filepath)
 | 
				
			||||||
 | 
					        next()
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -26,6 +26,7 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "multiblob": "^1.4.3",
 | 
					    "multiblob": "^1.4.3",
 | 
				
			||||||
 | 
					    "multicb": "^1.1.0",
 | 
				
			||||||
    "scuttlebot": "^4.2.3",
 | 
					    "scuttlebot": "^4.2.3",
 | 
				
			||||||
    "ssb-config": "^1.0.3"
 | 
					    "ssb-config": "^1.0.3"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user